2017-12-09 6 views
0

私はこの質問が多くの時間を要請されていることを知っていますが、それらを読んだ後でも私はこの問題を解決することができません。Xパスの解析:要素の接頭辞はバインドされていません

質問:1つのノード(GivenName)が名前空間(mpeg7)で定義され、ルート要素の先頭に宣言されているXMLが1つあります。 xpath式(// EpisodeOf/@ crid)を使用してjavax xpathを使用して属性を解析したいとします。ちょうど私がこのGivenNameノードをxmlから削除するときにコードをクリアするだけです。

XML:(Kotlinで)

<?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/SH000"/> 
       </BasicDescription> 
      </ProgramInformation> 
     </ProgramInformationTable> 
    </ProgramDescription> 
</TVAMain> 

コード:xpath.evaluate機能の

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 
     } 
    } 

取得エラー。

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を与えることで試してみましたが、それは、それはそれを使用していないに見えます。提案?

+0

は* *エラーの前に表示されますGETNAMESPACEをチェックしていますか? – kjhughes

+0

いいえ、私はそれらの印刷ステートメントを参照してください、なぜ私はそれを使用していないように見えるthats。 – mdev

答えて

1

いくつかの問題が: DocumentBuilderFactory.setNamespaceAware(true)

  • あなたは、名前空間の認識を可能にするためには表示されません。
  • XMLには、デフォルトの名前空間:urn:tva:metadata:2010があります。
  • getNamespaceURI()mpeg7の値を正しく返していません。 はurn:tva:mpeg7:2008を返す必要があります。

関連項目: How does XPath deal with XML namespaces?

+0

InputSourceパラメータでxpath.evaluateを使用していますが、この文を内部的に呼び出しています。Document document = getParser()。parse(source); getParser()メソッドでは、namespaceawareをtrueに設定してDocumentBuilderFactoryを作成します。 (com.sun.org.apache.xpath.internal.jaxp.XPathImpl)。デフォルトの名前空間を使用すると、この問題を引き起こす可能性がありますか? MyNamespaceContextクラスのprintステートメントは決して印刷されませんでしたので、私はそれに焦点を当てませんでしたが、訂正のために感謝します。私は提供されたリンクを調べます。 – mdev

+0

デフォルトの名前空間が問題の根本的な原因であることを暗示するわけではありません。書かれたXPathで説明する必要があります。 – kjhughes

+0

あなたのKotlinは正しいですか?なぜ、XPathがXMLネームスペースを扱うのですか?(***:https://stackoverflow.com/q/40796231/290085)のJavaの例に従ってください。 – kjhughes

関連する問題