如何解析目录中的xml文件?

时间:2014-01-30 04:22:55

标签: java xml

请告诉我如何在java中解析xml文件。 嗨有一个xml文件我想打印每个elemet的所有作者和标题。

我这样做但没有取得任何成功。

<?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();//

4 个答案:

答案 0 :(得分:0)

查看我的代码here 我去年做过这份工作,让我知道其他任何问题。您可以在url="cust.xml"部分指定要归档的路径。它是在Jsp中完成的,但如果你在Action类(如果使用Struts)或Servlet程序中都这样做会更好。

要获得更好的方法,请参阅this link

答案 1 :(得分:0)

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 Test

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

答案 2 :(得分:0)

您的问题似乎是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 :(得分:0)

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

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。