0

几周前,我提出了一个关于计算节点元素的问题,得到了一个很好的答案,帮助我理解了很多事情。链接在这里

但事实证明,现在我有不同的情况,我找不到一个好的解决方案。

这是我需要使用的代码:

<?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>

使用它来获取作者的数量(在这里查看上一个问题以了解):

eElement.getElementsByTagName("author").getLength()

返回我 NULL 因为里面没有元素,只有参数。

这有点明显,但是当我创建一个 NodeList 来解析作者时

doc.getElementsByTagName("author");

我得到了所有 5 个作者所以如果我只需要第二本书的作者,我会得到错误的信息。

我想知道一种从每本书中解析正确数量的作者的好方法。

提前致谢。

4

2 回答 2

0

使用 eElement.getElementsByTagName("book") 查找书籍,然后对于列表中的每个书籍元素,您可以使用 bElement.getElementsByTagName("author") 查找作者。

于 2013-09-16T12:21:25.163 回答
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 教程以获取更多详细信息

更新了其他示例

如果您花时间阅读XPath 教程,您就会知道 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"
于 2013-09-13T22:01:48.897 回答