java - Xpath解析: The prefix for element is not bound

标签 java xml xpath

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

问:我有一个 xml,其中有一个用命名空间(mpeg7)定义的节点(GivenName),并在根元素的顶部声明。 我想使用 javax xpath 使用 xpath 表达式(//EpisodeOf/@crid) 解析属性。只是为了清除代码,当我从 xml 中删除此 GiveName 节点时。

XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<TVAMain xmlns="urn:tva:metadata:2010" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:mpeg7="urn:tva:mpeg7:2008" publicationTime="2017-12-09T08:14:32Z" publisher="Gracenote, Inc." version="1"
         xml:lang="EN"
         xsi:schemaLocation="urn:tva:metadata:2010
                            http://developer.tmsapi.com/files/tva_metadata_3-1_v161.xsd
                            urn:tva:mpeg7:2008
                            http://developer.tmsapi.com/files/tva_mpeg7_2008.xsd">
    <ProgramDescription>
        <ProgramInformationTable>
            <ProgramInformation fragmentId="416885331" programId="someid">
                <BasicDescription>
                    <CreditsList>
                        <CreditsItem role="urn:mpeg:cs:RoleCS:2010:HOST" index="1">
                            <PersonName xml:lang="EN">
                                <mpeg7:GivenName xml:lang="EN">Azeb</mpeg7:GivenName>
                            </PersonName>
                        </CreditsItem>
                    </CreditsList>
                    <EpisodeOf type="Series" index="428" crid="crid://gn.tv/185326/SH007323210000"/>
                </BasicDescription>
            </ProgramInformation>
        </ProgramInformationTable>
    </ProgramDescription>
</TVAMain>

代码(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<Any?>? {
            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

另请参阅: How does XPath deal with XML namespaces?

关于java - Xpath解析: The prefix for element is not bound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47734400/

相关文章:

python - 挑出 xml 文档中的标签?

java - JUNIT测试void方法

java - 如何计算java中一个服务所花费的总时间?

python - 读取 XML 文件并在 Python 中获取其属性值

java - 需要一些有关 XPath 表达式的帮助。一个有效,另一个无效

java - 如何使用 xpath 获取遵循特定部分中的模式的链接?

javascript - 从节点 XSLT 中删除所有\n\r 字符?

java - 如何制作带显示的colspan :column

java - 关闭应用程序时 SWT 更新 UI

javascript - 使用JS/Jquery解析远程Xml文件?