几个星期前,我提出了一个关于计算节点元素的问题,得到了一个很好的答案,帮助我理解了很多东西。链接here。
但事实证明,现在我遇到了不同的情况,我无法找到一个好的解决方案。
这是我需要使用的代码:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<books>
<book id="1">
<title="Everyday Italian" category="cooking" year="2005" price="30.00"/>
<author name ="Giada De Laurentiis"/>
</book>
<book id="2">
<title="XQuery Kick Start" category="web" year="2003" price="49.99"/>
<author name ="James McGovern"/>
<author name ="Per Bothner"/>
<author name ="Kurt Cagle"/>
<author name ="James Linn"/>
</book>
<books>
</bookstore>
使用它来获取作者的数量(检查上一个问题的here):
eElement.getElementsByTagName("author").getLength()
返回NULL,因为里面没有元素,只有参数。
这有点明显,但是当我创建一个NodeList来解析作者时
doc.getElementsByTagName("author");
我得到了所有5位作者 因此,如果我只需要第二本书的作者,我将收到错误的信息。
我想知道从每本书中解析正确数量的作者的好方法。
提前致谢。
答案 0 :(得分:0)
虽然稍微开始工作,但我更喜欢使用XPath,这是查询XML的更强大的方法......
更新XML示例后,可以阅读...
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<books>
<book id="1">
<title name="Everyday Italian" category="cooking" year="2005" price="30.00"/>
<author name ="Giada De Laurentiis"/>
</book>
<book id="2">
<title name="XQuery Kick Start" category="web" year="2003" price="49.99"/>
<author name ="James McGovern"/>
<author name ="Per Bothner"/>
<author name ="Kurt Cagle"/>
<author name ="James Linn"/>
</book>
</books>
</bookstore>
我用过这个......
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class TestXPath100 {
public static void main(String[] args) {
InputStream is = null;
try {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("Test.xml"));
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
XPathExpression exp = xPath.compile("//author");
NodeList nl = (NodeList) exp.evaluate(doc, XPathConstants.NODESET);
System.out.println(nl.getLength());
} catch (ParserConfigurationException | XPathExpressionException | SAXException | IOException ex) {
} finally {
try {
is.close();
} catch (Exception e) {
}
}
}
}
哪个输出5
。
基本上,xPath查询会查找文档中名为author
的任何位置的所有节点
请查看XPath tutorial了解详情
更新了其他示例
如果您花时间阅读XPath tutorial,您会知道XPath是XML的查询语言(有点像SQL是数据库的查询语言)......
所以我更改了代码以转储所有匹配元素的name
属性并使用查询//book[title[@name='Everyday Italian']]/author
XPathExpression exp = xPath.compile("//book[title[@name='Everyday Italian']]/author");
NodeList nl = (NodeList) exp.evaluate(doc, XPathConstants.NODESET);
for (int index = 0; index < nl.getLength(); index++) {
Node node = nl.item(index);
System.out.println(node.getAttributes().getNamedItem("name"));
}
它输出......
name="Giada De Laurentiis"
我将查询更改为//book[title[@name='XQuery Kick Start']]/author
并输出了...
name="James McGovern"
name="Per Bothner"
name="Kurt Cagle"
name="James Linn"
答案 1 :(得分:0)
使用eElement.getElementsByTagName(“book”)查找书籍,然后对于列表中的每个书籍元素,您可以使用bElement.getElementsByTagName(“author”)查找作者。