1

XPATH を使用して XML から値を取得しようとしています。次の例外を受け取りました。

    [Fatal Error] books.xml:4:16: The prefix "abc" for element "abc:priority" is not bound.
Exception in thread "main" org.xml.sax.SAXParseException; systemId: file:///D:/XSL%20TEST%20APP%20BACK%20UP/XMLTestApp/books.xml; lineNumber: 4; columnNumber: 16; The prefix "abc" for element "abc:priority" is not bound.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
    at xpath.XPathExample.main(XPathExample.java:18)

XML が通常のものと少し異なるため、このエラーが発生します (以下を参照してください)。

<?xml version="1.0" encoding="UTF-8"?>
<inventory>
    <Sample>
    <abc:priority>1</abc:priority>  
    <abc:value>2</abc:value>        
    </Sample>
</inventory>

上記の XML から値を取得するコード (Java) は次のとおりです。

import java.io.IOException;
    import org.w3c.dom.*;
    import org.xml.sax.SAXException;
    import javax.xml.parsers.*;
    import javax.xml.xpath.*;

    public class XPathExample {

      public static void main(String[] args) 
       throws ParserConfigurationException, SAXException, 
              IOException, XPathExpressionException {

        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true); // never forget this!
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse("books.xml");

        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        XPathExpression expr 
         = xpath.compile("//Sample/*/text()");////book/Sample[author='Neal Stephenson']/title/text()

        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()); 
        }

      }

    }

セミコロンを削除すると、このエラーは発生しません。

XPATH を使用して上記のような XML からコンテンツを取得することは可能ですか?

4

2 に答える 2

2

Xpath を使用して、上記のような XML からコンテンツを取得することは可能ですか?」 - 私はそうは思いません。この XML は整形式ではありません。

仕様から ( http://www.w3.org/TR/REC-xml-names/#ns-qualnames ):

プレフィックスは、修飾名の名前空間プレフィックス部分を提供し、名前空間宣言で名前空間 URI 参照に関連付ける必要があります。[定義: LocalPart は修飾名のローカル部分を提供する。]

それをどうにかするには、名前空間宣言を追加する必要があると思います。

<inventory xmlns:abc="x">
    <Sample>
        <abc:priority>1</abc:priority>  
        <abc:value>2</abc:value>        
    </Sample>
</inventory>
于 2013-03-22T05:22:31.363 に答える
1

この行なしで試してください:

    domFactory.setNamespaceAware(true); // never forget this!

通常、名前空間を認識せずに実行することはお勧めできませんが、この特定のケースでは、入力ファイルがそのままであるため、それは理にかなっています。

于 2013-03-22T14:21:59.317 に答える