【问题标题】:How to parse xml file which is in directory?如何解析目录中的xml文件?
【发布时间】:2014-01-30 04:22:55
【问题描述】:

你能告诉我如何在 java 中解析 xml 文件吗? 嗨有一个 xml 文件,我想打印每个元素的所有作者和标题。

我也是这样做的,但没有成功。

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
   <book id="bk103">
      <author>Corets, Eva</author>
      <title>Maeve Ascendant</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-11-17</publish_date>
      <description>After the collapse of a nanotechnology 
      society in England, the young survivors lay the 
      foundation for a new society.</description>
   </book>
   <book id="bk104">
      <author>Corets, Eva</author>
      <title>Oberon's Legacy</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2001-03-10</publish_date>
      <description>In post-apocalypse England, the mysterious 
      agent known only as Oberon helps to create a new life 
      for the inhabitants of London. Sequel to Maeve 
      Ascendant.</description>
   </book>
   <book id="bk105">
      <author>Corets, Eva</author>
      <title>The Sundered Grail</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2001-09-10</publish_date>
      <description>The two daughters of Maeve, half-sisters, 
      battle one another for control of England. Sequel to 
      Oberon's Legacy.</description>
   </book>
   <book id="bk106">
      <author>Randall, Cynthia</author>
      <title>Lover Birds</title>
      <genre>Romance</genre>
      <price>4.95</price>
      <publish_date>2000-09-02</publish_date>
      <description>When Carla meets Paul at an ornithology 
      conference, tempers fly as feathers get ruffled.</description>
   </book>
   <book id="bk107">
      <author>Thurman, Paula</author>
      <title>Splish Splash</title>
      <genre>Romance</genre>
      <price>4.95</price>
      <publish_date>2000-11-02</publish_date>
      <description>A deep sea diver finds true love twenty 
      thousand leagues beneath the sea.</description>
   </book>
   <book id="bk108">
      <author>Knorr, Stefan</author>
      <title>Creepy Crawlies</title>
      <genre>Horror</genre>
      <price>4.95</price>
      <publish_date>2000-12-06</publish_date>
      <description>An anthology of horror stories about roaches,
      centipedes, scorpions  and other insects.</description>
   </book>

</catalog>

我喜欢这个..

private class Connection extends Thread {
    private String element;
    public Connection() {
        super();
    }
    public void run() {
        StreamConnection conn;
        String str=null;
        try {
            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder docBuilder = docBuilderFactory
                    .newDocumentBuilder();
            docBuilder.isValidating();
            InputStream inputStream = getClass().getResourceAsStream("/a.xml");

            Document document = docBuilder.parse(inputStream);
            document.getDocumentElement().normalize();

            NodeList list = document.getElementsByTagName("catalog");
            element = new String();
            // this "for" loop is used to parse through the
            // XML document and extract all elements and their
            // value, so they can be displayed on the device
            for (int i = 0; i < list.getLength(); i++) {
                Node value = list.item(i).getChildNodes().item(0);
                element = value.getNodeValue();
                synchronized (UiApplication.getEventLock()) {

                    add(new RichTextField("Title : " + element));
                 add(new SeparatorField());
                }
            }// end for
                                      //      screen.add(new RichTextField(str));
        }// end try
            // will catch any exception thrown by the XML parser
        catch (Exception e) {
           add(new RichTextField("Error : " + e.toString()));
        }
    }// end connection function
}// end connection class


connection = new Connection();
connection.start();//

【问题讨论】:

标签: java xml


【解决方案1】:

看看我的代码here 我去年完成了这项工作,如果有任何其他问题,请告诉我。您可以在 url="cust.xml" 部分中指定文件路径。它是在 Jsp 中完成的,但最好在 Action 类(如果使用 Struts 的情况下)或 Servlet 程序中完成。

如需更好的方法,请参阅this link

【讨论】:

    【解决方案2】:

    您的问题似乎是您选择catalog 而不是book 作为NodeList。这样,您的列表将只有一个元素而不是 8 个。尝试使用此代码(我将输出打印到控制台,但您可以随意使用它)

    NodeList list = document.getElementsByTagName("book");
    for (int i = 0; i < list.getLength(); i++) {
        NodeList childs = list.item(i).getChildNodes();
    
        //iterate over all child nodes like author/title/description
        for (int j = 0; j < childs.getLength(); j++) {
            Node child = childs.item(j);
            //if node is the one we are looking for print it
            if (child.getNodeName().equals("author"))
                System.out.println("author : "+child.getTextContent());
            if (child.getNodeName().equals("title"))
                System.out.println("title : "+child.getTextContent());
        }
        System.out.println("------------");//
    }// end for
    

    另一种方法是使用其他解析器。我喜欢 Jsoup,它主要用于解析 HTML,但它也有 XML 解析器。它的代码可能是这样的

    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.parser.Parser;
    
    ...
    
        InputStream xml = new FileInputStream("input.txt");
        Document doc = Jsoup.parse(xml, "utf-8", "", Parser.xmlParser());
        for (Element e : doc.select("book author, book title")) {
            System.out.println(e.nodeName() + ": " + e.text());
        }
    

    【讨论】:

      【解决方案3】:

      您正在获取目录节点的句柄。代码中的以下行从目录节点下的所有子节点列表中获取第一个子节点。它将指向第一个 book 节点。

      Node value = list.item(i).getChildNodes().item(0);
      

      此节点的值为空白,因为这不是文本节点。您需要获取标题节点的句柄,然后打印其值。您可以通过获取所有书籍节点的列表然后到达标题节点来做到这一点。请注意,title 节点的索引为 2,因为索引 0 将是 book 元素的属性节点。

      NodeList list = document.getElementsByTagName("book");
              element = new String();
              // this "for" loop is used to parse through the
              // XML document and extract all elements and their
              // value, so they can be displayed on the device
              for (int i = 0; i < list.getLength(); i++) {
                  Element thisNode = (Element)list.item(i);
                  Node value = (Node)(list.item(i).getChildNodes().item(2));
                  System.out.println(value.getTextContent() +"-");                
      
              }// end for
      

      我不建议您使用这种方法。更好的方法是使用之前回答的 XPath,或者您可以使用 JAXB,以防您更新数据并重新生成 XML。

      【讨论】:

        【解决方案4】:

        XPath 在这里可能是最直接的。试一试...

        Test.java

        import javax.xml.parsers.DocumentBuilder;
        import javax.xml.parsers.DocumentBuilderFactory;
        import javax.xml.xpath.XPathFactory;
        import javax.xml.xpath.XPath;
        import javax.xml.xpath.XPathExpression;
        import javax.xml.xpath.XPathConstants;
        
        import org.w3c.dom.Document;
        import org.w3c.dom.Element;
        import org.w3c.dom.Node;
        import org.w3c.dom.NodeList;
        import org.xml.sax.SAXException;
        import org.xml.sax.SAXParseException;
        
        public class Test {
        
          public static void main(String[] args) throws Exception {
        
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse("file:///C:/path/to/books.xml");
            XPathFactory xPathfactory = XPathFactory.newInstance();
            XPath xpath = xPathfactory.newXPath();
            XPathExpression expr = xpath.compile("//book/author|//book/title");
            NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
            for (int i = 0; i < nl.getLength(); i++) {
                Node currentNode = nl.item(i);
                if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
                    System.out.println(currentNode.getTextContent());
                }
            }
        
          }
        
        }
        

        javac -classpath jaxp-api-1.4.jar Test.java

        java测试

        Gambardella, Matthew
        XML Developer's Guide
        Ralls, Kim
        Midnight Rain
        Corets, Eva
        Maeve Ascendant
        Corets, Eva
        Oberon's Legacy
        Corets, Eva
        The Sundered Grail
        Randall, Cynthia
        Lover Birds
        Thurman, Paula
        Splish Splash
        Knorr, Stefan
        Creepy Crawlies
        

        【讨论】:

          猜你喜欢
          • 2020-03-30
          • 1970-01-01
          • 2020-04-09
          • 2016-11-07
          • 2020-06-07
          • 1970-01-01
          • 2017-02-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多