我正在尝试从我的XML数据文件中打印特定节点,例如Pantone 100。我希望打印出pantone 100的所有属性,例如所有颜色和它们持有的数据但是我不确定如何正确地格式化XPath编译方式,它只会拉出特定的pantone数字我是寻找。
编辑:下面的代码输出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());
}
}
}
输出 空
答案 0 :(得分:3)
我不是xpath的专家(从字面上了解到它今天)所以我不是百分之百确定这个,但你有/inventory/product/pantone/text(@=100)
,而是试试这个:
/inventory/Product[@pantone='100']
据我了解,这会使Product
与属于pantone
的属性"100"
相匹配。
至于打印数据,我不确定,但希望这会让你走上正轨。
修改:查看此页面:
Node
。它是Node
类型的javadoc。正如geert3在他/她的回答中所说getNodeValue()
返回节点的值,在这种情况下是元素的值,而不是属性(例如:在<element>value</element>
中元素元素的值是值)在你的情况下是null
,因为它是空的(如果它认为类型是字符串可能是""
而不是null
?)。尝试拨打
Node#getAttributes()
,然后使用NamedNodeMap
在NamedNodeMap#item(int)
内进行迭代,以获取Node
。 这些 应该是属性(我想,如果我正确理解API)。getNodeName()
应该是属性的名称(例如pantone
),getNodeValue()
应该是属性的值(例如100
)。
答案 1 :(得分:2)
输出为空,因为此处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()
分别检索属性名称或值。