0

Java/XPath と Namepsaces のトピックについてかなりの議論を見てきましたが、これらの質問に対する答えが私の問題に役立つかどうかはわかりません。

一部の XML を取得するプログラムがあります。事前に形式はわかりませんが、名前空間が含まれている可能性があります。ユーザーは、XML から特定のデータを抽出するために使用される xpath 式を指定できます。コードは汎用的です。事前に XML の形式がわからないため、名前空間などでコンパイルすることはできません。

したがって、XML は次のようになります。

<ns1:item id='myroot' xmlns:ns1='http://www.myplace.com/place'>
    <ns1:category id='cat1'>
        <ns1:item id='item1'>
            <ns1:category id='cat2'></ns1:category>
        </ns1:item>
    </ns1:category>
</ns1:item>

ユーザーが入力する xpath は次のようになります。

/ns1:item[@id='myroot']/ns1:category[@id='cat1']

しかし、次のコードを使用すると、常に何も得られません (XPath を試してみても)。

public static String evaluate(String xml, String xpathExpression) throws Exception
{
    String result = "";
    InputSource is = new InputSource(new StringReader(xml));
    XPath xPath = XPathFactory.newInstance().newXPath();
    result = xPath.evaluate(xpathExpression, is);
    System.out.println("result=" +result);
}

どんな助けでも大歓迎です。

ありがとう

4

2 に答える 2

2

本質的に、次のような表現

/ns1:item[@id='myroot']/ns1:category[@id='cat1']

ns1 が何を指しているのかを知らなければ意味がありません。したがって、ユーザーがこの形式で式を提供する場合、ns1 の意味も伝える必要があります。

XPath 3.0 (とうとう) は、プレフィックス バインディングの知識に依存しない XPath 式を定義する方法を提供します。次のように記述できます。

/Q{http://www.myplace.com/place}item[@id='myroot']/Q{http://www.myplace.com/place}category[@id='cat1']

しかし、1.0 と 2.0 でこれを達成する唯一の方法は、

/*[local-name()='item' and namespace-uri()='http://www.myplace.com/place'][@id='myroot']/*[local-name()='category' and namespace-uri()='http://www.myplace.com/place'][@id='cat1']
于 2013-03-19T08:16:15.140 に答える
1

「MadProgrammer」からのコメントは、探していた答えを見つけるのに役立ちました。

String result = "";

DocumentBuilderFactory xmlFactory = DocumentBuilderFactory.newInstance();

xmlFactory.setNamespaceAware(false);

DocumentBuilder builder = xmlFactory.newDocumentBuilder();
InputSource is = new InputSource(new StringReader(xml));
Document document = builder.parse(is);
XPath xPath = XPathFactory.newInstance().newXPath();

result = xPath.evaluate(xpathExpression, document);

return result;

ありがとう。

于 2013-03-20T13:52:54.843 に答える