我有一个包含许多不同节点的xml文件。特别是有些嵌套如下:

 <emailAddresses>
            <emailAddress>
                <value>[email protected]</value>
                <typeSource>WORK</typeSource>
                <typeUser></typeUser>
                <primary>false</primary>
            </emailAddress>
            <emailAddress>
                <value>[email protected]</value>
                <typeSource>HOME</typeSource>
                <typeUser></typeUser>
                <primary>true</primary>
            </emailAddress>
        </emailAddresses>


从上面的节点,我想做的是遍历每个节点并获取其中的值(值,typeSource,typeUser等),并将其放入POJO中。

我试图查看我是否可以使用此xpath表达式"//emailAddress",但它不会向我返回其中的标签。也许我做错了。我是使用xpath的新手。

我可以做这样的事情:

//emailAddress/value | //emailAddress/typeSource | ..,但是这样做可以将所有元素值一起列出,如果我没弄错的话,当我从特定的emailAddress标记中读取完并转到下一个emailAddress标记时,我可以进行计算。

很好地总结我的需求,我基本上希望返回的结果类似于您从沼泽标准sql查询中返回结果的方式,该查询连续返回结果。即,如果您的sql查询产生10个emailAddress,它将连续返回每个emailAddress,而我可以简单地遍历“每个emailAddress”并根据列名或索引获取适当的值。

最佳答案

没有,


  //电子邮件地址


没有返回标签,这是正确的。它返回的是NodeList / NodeSet。要实际获取值,您可以执行以下操作:

String emailpath = "//emailAddress";
String emailvalue = ".//value";

XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xpath = xPathFactory.newXPath();
Document document;
public XpathStuff(String file) throws ParserConfigurationException, IOException, SAXException {
    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = docFactory.newDocumentBuilder();

    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
    document = builder.parse(bis);

    NodeList nodeList = getNodeList(document, emailpath);
    for(int i = 0; i < nodeList.getLength(); i++){
        System.out.println(getValue(nodeList.item(i), emailvalue));
    }
    bis.close();
}

public NodeList getNodeList(Document doc, String expr) {
    try {
        XPathExpression pathExpr = xpath.compile(expr);
        return (NodeList) pathExpr.evaluate(doc, XPathConstants.NODESET);
    } catch (XPathExpressionException e) {
        e.printStackTrace();
    }
    return null;
}


//extracts the String value for the given expression
private String getValue(Node n, String expr) {
    try {
        XPathExpression pathExpr = xpath.compile(expr);
        return (String) pathExpr.evaluate(n,
                XPathConstants.STRING);
    } catch (XPathExpressionException e) {
        e.printStackTrace();
    }
    return null;
}


也许我应该指出,当遍历Nodelist时,在.//values中,第一个点表示当前上下文。没有点,您将始终获得第一个节点。

10-05 17:46