请告诉我如何在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();//
答案 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。