我正在尝试从我的XML数据文件中打印一个特定的节点,例如Pantone 100。我想要它打印所有的属性从潘通100,如所有的颜色和数据,他们持有,但我不知道如何格式化的XPath编译正确的方式,它将只提取特定的潘通号码,我正在寻找。
编辑:下面的代码输出null
XML数据
<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>码
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());
}
}
}输出空
发布于 2015-07-21 20:14:08
输出为空,因为getNodeValue在这里不适用。getTextContent会在开始标记和结束标记之间给出文本,例如本例中的FOOBAR:
<Product pantone="100" blue="7.4" red="35" green="24">FOOBAR</Product>`.但是,如果要打印结果集的所有属性值:
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()分别检索属性名称或值。
发布于 2015-07-21 19:50:02
我不是xpath方面的专家(从字面上说是今天学到的),所以我不能百分之百地肯定这一点,但是您可以使用/inventory/product/pantone/text(@=100),而是尝试如下:
/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)。
https://stackoverflow.com/questions/31547431
复制相似问题