2016-07-03 93 views
2

我試圖訪問屬性值的名稱訪問屬性值,但屬性名稱包含特殊字符,例如:XPath來與具有特殊字符

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <row> 
    <ELEMENT1 at:it="true">W</ELEMENT1>------ 
    <ELEMENT2>IN</ELEMENT2> 
    <ELEMENT3>RP</ELEMENT3> 
    <ELEMENT4>KKK</ELEMENT4> 
    </row> 
    <row> 
    <ELEMENT1 acón='sys'>2</ELEMENT1>------ 
    <ELEMENT2>ARQ</ELEMENT2> 
    <ELEMENT3>MR</ELEMENT3> 
    <ELEMENT4>AC</ELEMENT4> 
    </row> 
    <row> 
    <ELEMENT1>3</ELEMENT1> 
    <ELEMENT2>I</ELEMENT2> 
    <ELEMENT3 at:it="true" >RP</ELEMENT3>------ 
    <ELEMENT4>KKK</ELEMENT4> 
    </row> 
    <row> 
    <ELEMENT1>1</ELEMENT1> 
    <ELEMENT2>CC</ELEMENT2> 
    <ELEMENT3>XX</ELEMENT3> 
    <ELEMENT4 eléct='false' >I</ELEMENT4>------ 
    </row> 
    <row> 
    <ELEMENT1>12</ELEMENT1> 
    <ELEMENT2 at:it="true" >IN</ELEMENT2>------ 
    <ELEMENT3>3</ELEMENT3> 
    <ELEMENT4></ELEMENT4> 
    </row> 
</root> 

如果我改變的名稱屬性並刪除它們特殊字符,我可以訪問它們:

at:it ------> atit 
Acón ------> Acon 
eléctr ------> elect 

但屬性與特殊字符的名稱,我不能XPath查詢表達式訪問它們。

我如何訪問一個XML文件,以獲得具有特殊字符名稱的屬性值?

將XML文件轉換爲DOM我使用了Java6,javax.xml。 ,org.w3c.dom。

+0

天使,歡迎堆棧溢出。你已經在這裏待了幾個月,並提出了9個問題,但還沒有[**接受**](http://meta.stackoverflow.com/q/5234/234215)或[** upvote **] (http://stackoverflow.com/help/why-vote)任何答案。請閱讀鏈接的頁面,並考慮接受和/或upvoting幫助你的答案。謝謝。 – kjhughes

回答

1

認識到,一個冒號(:should只能在一個元件中使用或屬性名稱如果命名空間前綴的一部分:

在XML建議的命名空間[XML Names]分配一個意思是 包含冒號的名字。因此,除命名空間以外,作者不應在XML名稱中使用冒號,但XML 處理器必須接受冒號作爲名稱字符。

所以,

/root/row/ELEMENT1/@at:it 

將努力選擇"true"只要你通過定義at命名空間前綴在XML(最好)改變你的XML,

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:at="http://example.com/at"> 
    <row> 
    <ELEMENT1 at:it="true">W</ELEMENT1>------ 
    <ELEMENT2>IN</ELEMENT2> 
    <ELEMENT3>RP</ELEMENT3> 
    <ELEMENT4>KKK</ELEMENT4> 
    </row> 
    <row> 
    <ELEMENT1 acón='sys'>2</ELEMENT1>------ 
    <ELEMENT2>ARQ</ELEMENT2> 
    <ELEMENT3>MR</ELEMENT3> 
    <ELEMENT4>AC</ELEMENT4> 
    </row> 
    <row> 
    <ELEMENT1>3</ELEMENT1> 
    <ELEMENT2>I</ELEMENT2> 
    <ELEMENT3 at:it="true" >RP</ELEMENT3>------ 
    <ELEMENT4>KKK</ELEMENT4> 
    </row> 
    <row> 
    <ELEMENT1>1</ELEMENT1> 
    <ELEMENT2>CC</ELEMENT2> 
    <ELEMENT3>XX</ELEMENT3> 
    <ELEMENT4 eléct='false' >I</ELEMENT4>------ 
    </row> 
    <row> 
    <ELEMENT1>12</ELEMENT1> 
    <ELEMENT2 at:it="true" >IN</ELEMENT2>------ 
    <ELEMENT3>3</ELEMENT3> 
    <ELEMENT4></ELEMENT4> 
    </row> 
</root> 

或指示您的XML處理器忽略XML名稱空間(而不是最佳實踐)。

接下來的兩個案件是罰款:

/root/row/ELEMENT1/@acón 

將選擇"sys"沒有問題提供您的XPath處理器支持UTF-8編碼(應該)。

/root/row/ELEMENT4/@eléct 

將類似地選擇"false"

+0

謝謝,我試過... factory.setNamespaceAware(false); ...但它仍然不能很好地工作......我也嘗試過...... factory.setNamespaceAware(true); ...和xsi:它。 ..但不工作..我將繼續測試 –

+0

如上所述,除非它是名稱空間前綴的一部分,否則不應在元素或屬性名稱中使用冒號。雖然技術上允許它,但我不驚訝你聽到你遇到麻煩。真的,不要這樣做。 – kjhughes

0

我用Java 6試了一下,沒有問題訪問帶有重音的屬性。冒號是一種特殊情況,因爲它用於表示具有名稱空間前綴的元素/屬性名稱。 XML不使用名稱空間,否則前綴爲at的名稱空間聲明。

XML解析器有一個開關,用於將冒號作爲名稱的一部分來處理,但XPath引擎總是可以識別名稱空間。但有一點技巧,還可以:

File xmlFile = new File("in.xml"); 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
// Parse without namespaces. Otherwise parsing leads to an error 
// because there is no namespace declaration for prefix 'at'. 
factory.setNamespaceAware(false); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document doc = builder.parse(xmlFile); 

XPathFactory xPathfactory = XPathFactory.newInstance(); 
XPath xpath = xPathfactory.newXPath(); 

XPathExpression expr1 = xpath.compile("/root/row/ELEMENT1/@acón"); 
//XPathExpression expr2 = xpath.compile("/root/row/ELEMENT1/@at:it"); Doesn't work! 
XPathExpression expr2 = xpath.compile("/root/row/ELEMENT1/@*[name() = 'at:it']"); 
XPathExpression expr3 = xpath.compile("/root/row/ELEMENT4/@eléct"); 

System.out.println((String) expr1.evaluate(doc, XPathConstants.STRING)); 
System.out.println((String) expr2.evaluate(doc, XPathConstants.STRING)); 
System.out.println((String) expr3.evaluate(doc, XPathConstants.STRING)); 

輸出是:

sys 
true 
false 
+0

...謝謝,我曾嘗試過... factory.setNamespaceAware(false); .... 但它仍然無法正常工作 –