首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java XPath表达式错误

Java XPath表达式错误
EN

Stack Overflow用户
提问于 2015-07-21 18:58:30
回答 2查看 450关注 0票数 1

我正在尝试从我的XML数据文件中打印一个特定的节点,例如Pantone 100。我想要它打印所有的属性从潘通100,如所有的颜色和数据,他们持有,但我不知道如何格式化的XPath编译正确的方式,它将只提取特定的潘通号码,我正在寻找。

编辑:下面的代码输出null

XML数据

代码语言:javascript
复制
<inventory>
    <Product pantone="100" blue="7.4" red="35" green="24"> </Product>
    <Product pantone="101" blue="5.4" red="3" rubine="35" purple="24"> </Product>
    <Product pantone="102" orange="5.4" purple="35" white="24"> </Product>
    <Product pantone="103" orange="5.4" purple="35" white="24"> </Product>
    <Product pantone="104" orange="5.4" purple="35" white="24"> </Product>
    <Product pantone="105" orange="5.4" purple="35" white="24"> </Product>
    <Product pantone="106" black="5.4" rubine="35" white="24" purple="35" orange="5.4"> </Product>
</inventory>

代码语言:javascript
复制
import org.w3c.dom.*;
import javax.xml.xpath.*;
import javax.xml.parsers.*;
import java.io.IOException;
import org.xml.sax.SAXException;

public class XPathDemo {

    public static void main(String[] args)
            throws ParserConfigurationException, SAXException,
            IOException, XPathExpressionException {

        DocumentBuilderFactory domFactory
                = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true);
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse("data.xml");
        XPath xpath = XPathFactory.newInstance().newXPath();
        // XPath Query for showing all nodes value
        XPathExpression expr = xpath.compile("/inventory/Product[@pantone='100']");

        Object result = expr.evaluate(doc, XPathConstants.NODESET);
        NodeList nodes = (NodeList) result;
        for (int i = 0; i < nodes.getLength(); i++) {
            System.out.println(nodes.item(i).getNodeValue());
        }
    }
}

输出空

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-21 20:14:08

输出为空,因为getNodeValue在这里不适用。getTextContent会在开始标记和结束标记之间给出文本,例如本例中的FOOBAR:

代码语言:javascript
复制
<Product pantone="100" blue="7.4" red="35" green="24">FOOBAR</Product>`.

但是,如果要打印结果集的所有属性值:

代码语言:javascript
复制
    NodeList nodes = (NodeList)result;
    for (int i = 0; i < nodes.getLength(); i++)
    {
        NamedNodeMap a = nodes.item(i).getAttributes();
        for (int j=0; j<a.getLength(); j++)
            System.out.println(a.item(j));
    }

或者使用a.item(j).getNodeName()a.item(j).getNodeValue()分别检索属性名称或值。

票数 2
EN

Stack Overflow用户

发布于 2015-07-21 19:50:02

我不是xpath方面的专家(从字面上说是今天学到的),所以我不能百分之百地肯定这一点,但是您可以使用/inventory/product/pantone/text(@=100),而是尝试如下:

代码语言:javascript
复制
/inventory/Product[@pantone='100']

据我所知,这将使Product与等于"100"的属性pantone相匹配。

至于打印数据,我不确定,但希望这将使你走上正确的轨道。

编辑:查看这个页面:Node。它是Node类型的javadoc。正如geert3在他/她的答案中所说的,getNodeValue()返回节点的值,在本例中是元素的值,而不是属性(例如:在<element>value</element>中,元素的值是值),在您的示例中,该值是null,因为它是空的(如果它认为类型是字符串,那么它可能是""而不是null?) 尝试调用Node#getAttributes(),然后使用NamedNodeMap#item(int)NamedNodeMap中迭代以获得Nodes。这些应该是属性(我认为,如果我正确理解了API )。getNodeName()应该是属性的名称(例如,pantone),getNodeValue()应该是属性的值(例如,100)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31547431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档