import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;public class XmlTest {
public static void main(String args[]) throws JDOMException, IOException {
SAXBuilder builder = new SAXBuilder();
Document root = builder.build(new File("d:/t.txt"));
Element shujia = root.getRootElement();
List<Map<String,String>> shuList = new ArrayList<Map<String,String>>();
for(Object e : shujia.getChildren()){
Element shu = (Element) e;
parseShu(shu,shuList);
}
System.out.println(shuList);
} private static void parseShu(Element shu, List<Map<String, String>> shuList) {
if(shu == null || !shu.getName().equals("书"))
return;
HashMap<String,String> map = new HashMap<String, String>();
for(Object e : shu.getChildren()){
Element field = (Element) e;
map.put(field.getName(), field.getText());
}
shuList.add(map);
}
}解析结果
[{书名=xml基础 , 作者=张明 , 售价=20.00元 }, {书名=java高级教程 , 作者=张明行 , 售价=23.50元 , 出版社=人教社 }]

解决方案 »

  1.   


    运行3楼的代码报错:Exception in thread "main" org.jdom.input.JDOMParseException: Error on line 1 of document file:/d:/t.txt: White space is required between the processing instruction target and data.
    at org.jdom.input.SAXBuilder.build(SAXBuilder.java:465)
    at org.jdom.input.SAXBuilder.build(SAXBuilder.java:810)
    at org.jdom.input.SAXBuilder.build(SAXBuilder.java:789)
    at XmlTest.main(XmlTest.java:16)
    Caused by: org.xml.sax.SAXParseException: White space is required between the processing instruction target and data.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1411)
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPIData(XMLScanner.java:712)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanPIData(XMLDocumentFragmentScannerImpl.java:1016)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$XMLDeclDriver.next(XMLDocumentScannerImpl.java:807)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:452)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
    at org.jdom.input.SAXBuilder.build(SAXBuilder.java:453)
    ... 3 more
    Caused by: org.xml.sax.SAXParseException: White space is required between the processing instruction target and data.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1411)
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPIData(XMLScanner.java:712)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanPIData(XMLDocumentFragmentScannerImpl.java:1016)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$XMLDeclDriver.next(XMLDocumentScannerImpl.java:807)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:452)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
    at org.jdom.input.SAXBuilder.build(SAXBuilder.java:453)
    at org.jdom.input.SAXBuilder.build(SAXBuilder.java:810)
    at org.jdom.input.SAXBuilder.build(SAXBuilder.java:789)
    at XmlTest.main(XmlTest.java:16)
      

  2.   

    我疏忽了:<?xmlversion="1.0" ?> 应该有空格xml version
      

  3.   

    读取文件或者字符,从InputStream编译成XML就可以了。import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.StringWriter;import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;import org.apache.log4j.Logger;
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.xml.sax.SAXException;
    import org.xml.sax.SAXParseException;
    ...public static Document parse(InputStream is) {

    // Initiate DocumentBuilderFactory
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    // To get a validating parser
    factory.setValidating(false);
    // To get one that understands namespaces
    factory.setNamespaceAware(true);

    try {
    // Get DocumentBuilder
    DocumentBuilder builder = factory.newDocumentBuilder();
    return builder.parse( is);

    } catch (SAXParseException spe) {
    // Error generated by the parser
    ...
    } catch (SAXException sxe) {
    // Error generated during parsing
    ...
    } catch (ParserConfigurationException pce) {
    // Parser with specified options can't be built
    ...
    } catch (IOException ioe) {
    // I/O error
    ...
    }

    return null;
    }
    public static Document parse(File file) throws FileNotFoundException {
    return parse(new FileInputStream(file));
    } public static Document parse(String xmlString) {
    return parse(new java.io.ByteArrayInputStream(xmlString.getBytes()));
    }
      

  4.   

    我不知道你不明白什么地方。上面的代码是完整的,可以直接调用,返回w3c的XML Document。直接从inputstream的意思就是程序不需要你手动去读每个节点,解析过程完全自动(看代码你也能发现这一点)。