簡體   English   中英

XML格式未知時的Java XPath命名空間

[英]Java XPath Namespaces when format of XML is unknown

我已經在Java / XPath和Namepsaces主題上進行了很多討論,但是我不確定這些問題的答案是否可以解決我的特定問題。

我有一個可以容納一些XML的程序-我事先不知道格式,但是它可能包含名稱空間。 用戶可以提供一個xpath表達式,該表達式將用於從XML中提取特定的數據。 代碼是通用的-我無法在任何名稱空間或類似名稱中進行編譯,因為我不預先知道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);
}

任何幫助,不勝感激。

謝謝

本質上,類似

/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']

來自“ 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;

謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM