【问题标题】:How to differentitae between records while parsing xml using Xpath如何在使用 Xpath 解析 xml 时区分记录
【发布时间】:2013-07-10 19:49:26
【问题描述】:

我有一个这样的xml

<Processed>
    <address>
        <buildingnumber> 29 </buildingnumber>
        <street> South Lasalle Street</street>
        <city>Chicago</city>
        <state>Illinois</state>
        <zip>60603</zip>
    </address>

    <address>
        <buildingnumber> 30 </buildingnumber>
        <street> West Street</street>
        <city>xxx</city>
        <state>yyy</state>
        <zip>12345</zip>
    </address>
</Processed>

我正在使用以下代码来打印值

DocumentBuilder builder = tryDom.getDocumentBuilder();
xmlDocument = tryDom.getXmlDocument(builder, file);

factory = XPathFactory.newInstance();
xPath = factory.newXPath();

String expression8 = "//address/descendant-or-self::*[not(*)]";

try {

    xPathExpression = xPath.compile(expression8);
    Object result = xPathExpression.evaluate(xmlDocument,XPathConstants.NODESET);
    printXpathResult(result);

} catch (XPathExpressionException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

public static void printXpathResult(Object result){

    NodeList nodes = (NodeList) result;

    for (int i = 0; i < nodes.getLength(); i++) {   
        Node node = nodes.item(i);
        String nodeName = node.getNodeName();
        String nodeValue = node.getTextContent();

        System.out.println(nodeName + " = " + nodeValue);
    }
} //end of printXpathResult()

它给了我像

这样的输出
buildingnumber =  29 
street =  South Lasalle Street
city = Chicago
state = Illinois
zip = 60603
buildingnumber =  30 
street =  West Street
city = xxx
state = yyy
zip = 12345

但问题是我不知道一个地址何时结束而另一个地址何时开始。我想要在zip = 60603 之后。我知道第一个地址是结束,其他地址是开始。如何区分记录?

谢谢

【问题讨论】:

  • 你知道地址节点出现在相关节点之前的个数吗
  • 不,因为我实时从网上获取 xml,我不知道会有多少地址记录......我希望每条记录都有一些我如何知道新的记录开始...
  • 我建议将您的 xpaht 更改为“//address”,然后遍历结果 NodeList 的子节点(现在是“地址”。

标签: java dom xpath xml-parsing


【解决方案1】:

这将为您提供您知道的具有 zip 的地址节点的位置(假设它是 x)

  count(Processed/address[zip='60603']/preceding-sibling::*)+1

然后使用

   String expression8 = "//address[x+1]/descendant-or-self::*[not(*)]";

试试吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    相关资源
    最近更新 更多