Xpath解析:元素的前缀没有绑定

我知道这个问题已经被问了很多次,但是即使在阅读之后,我也无法解决这个问题。

问:我有一个XML,其中有一个节点(GivenName)用一个名称空间(mpeg7)定义并在根元素顶部声明。 我想用xpathexpression式(// EpisodeOf / @ crid)使用javax xpath解析一个属性。 只是为了清除代码工程,当我从XML中删除这个GivenName节点。

XML:

         Azeb          

代码(在Kotlin):

 val xpath = XPathFactory.newInstance().newXPath() xpath.namespaceContext = MyNamespaceContext() val extractedValue = xpath.evaluate("",InputSource(StringReader(AboveXMLInStringVariable)), qName)} class MyNamespaceContext : NamespaceContext { override fun getNamespaceURI(prefix: String?): String { println("checking for getnamespace") if (prefix == null) { throw IllegalArgumentException("No prefix provided!"); } else if (prefix.equals("mpeg7")) { return "http://developer.tmsapi.com/files/tva_mpeg7_2008.xsd"; } else { return XMLConstants.NULL_NS_URI; } } override fun getPrefix(namespaceURI: String?): String { return "" } override fun getPrefixes(namespaceURI: String?): MutableIterator? { return null } } 

获取xpath.evaluate函数的错误。

 Caused by: org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 60; The prefix "mpeg7" for element ":GivenName" is not bound. at org.apache.xerces.parsers.DOMParser.parse(Unknown Source) at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source) at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:466) ... 38 more 

问题:我试图通过给它NameSpaceContext,但它看起来没有使用它。 建议?

几个问题:

  • 您似乎没有启用名称空间感知: DocumentBuilderFactory.setNamespaceAware(true)
  • 你的XML有一个默认的命名空间: urn:tva:metadata:2010
  • 你的getNamespaceURI()mpeg7返回错误的值; 它应该返回urn:tva:mpeg7:2008

另请参见: XPath如何处理XML名称空间?