在java中使用xpath从具有多个命名空间的xml文件中提取值
我试图用java中的多个名称空间提取节点值,但没有成功。xml文件如下所示:在java中使用xpath从具有多个命名空间的xml文件中提取值,java,xml,xpath,Java,Xml,Xpath,我试图用java中的多个名称空间提取节点值,但没有成功。xml文件如下所示: <ns26:start xmlns:ns26="http://www.tektronix.com/iris/isa/capture/start" xmlns:ns31="http://www.tektronix.com/iris/isa/filters" xmlns:ns13="http://www.tektronix.com/iris/
<ns26:start xmlns:ns26="http://www.tektronix.com/iris/isa/capture/start"
xmlns:ns31="http://www.tektronix.com/iris/isa/filters"
xmlns:ns13="http://www.tektronix.com/iris/isa/monitoredObjects"
xmlns:ns6="http://www.tektronix.com/iris/isa"
xmlns:ns10="http://www.tektronix.com/iris/isa/monNodeObjects"
xmlns:ns7="http://www.tektronix.com/iris/isa/capture/monitoredElements"
xmlns:ns11="http://www.tektronix.com/iris/isa/pointcodes"
xmlns:ns8="http://www.tektronix.com/iris/isa/capture/captureSession"
xmlns:ns2="http://www.tektronix.com/iris/isa/sessionSaveInfo"
xmlns:ns4="http://www.tektronix.com/iris/isa/customData"
xmlns:ns3="http://www.tektronix.com/iris/isa/manifest">
<ns6:Id>LAB:11300/isaclient;440</ns6:Id>
</ns26:start>
表达式
/*[local-name()='start']/*[local-name()='Id']
有效,对于示例文档,结果节点列表中应包含一个节点
但是您应该使用
nodes.item(i).getTextContent()
来检索节点内容,因为getNodeValue()
为元素节点返回null
。是的,这正是我正在做的,但没有成功。即使我将表达式更改为/*[local-name()='start'],仍然找不到节点。@KevinChen您的原始表达式不包含星号。不管怎样,这个表达式是有效的,所以一定是出了什么问题——当您运行xpath时,您的代码中可能有一个bug?我在最初的帖子中发布了java代码。ThanksGood catch,但是nodes.length()返回0。没有匹配的节点。所以没有要迭代的节点。@KevinChen我在本地运行了您的示例,没有问题。刚才使用了一个“InputSource”,指向本地文件和问题中的常量表达式。因此,还有其他问题。祝你好运
public static List<String> getXPathValueNamespace(String xml, String expression throws ParserConfigurationException, SAXException, IOException, XPathExpressionException
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder;
Document doc = null;
List<String> list = new ArrayList<String>();
builder = factory.newDocumentBuilder();
InputSource source = new InputSource(new StringReader(xml));
doc = builder.parse(source);
// Create XPathFactory object
XPathFactory xpathFactory = XPathFactory.newInstance();
// Create XPath object
XPath xpath = xpathFactory.newXPath();
XPathExpression expr = xpath.compile(expression);
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); i++)
list.add(nodes.item(i).getNodeValue());
return list;
}