2011-08-19 105 views
3

在我已經存儲的複雜XML中,就像String一樣,我必須進行一些text/xml處理。目標是找到節點的起始索引節點。除了節點(節點/元素類參考)我也有關於嵌套信息:整數的數組說,在哪個孩子應該介入。例如。數組:XML文本處理

2 1 0 

而定樹

root 
    |--root-child0 
    |--root-child1 
    |--root-child2 
     |--root-child2-child0 
     |--root-child2-child1 
        |--root-child2-child1-child0 

我尋找根的child2-child1-child0

是否有任何乾淨可能性找到這樣的項目。只是字符串查找(String.indexOf())是不夠的 - 在我的XML文件中有許多相同的標籤。除此之外,還存在一個額外的困難 - 在一些父母和子女之間可以存在一個額外的標籤(收藏)。 (如根的child2唯一的孩子可能是收集和根的child2-child0和根的child2-child1此收藏的兒童)

--edit

如果這能幫助 - 除了上面提到的嵌套信息之外,我還可以獲得與正在搜索的節點的路徑上的節點相對應的節點名稱。

--edit 2

有了這樣的xml文件

<catalog> 
    <book id="bk101"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
    </book> 
    <book id="bk102"> 
     <author>Ralls, Kim</author> 
     <title>Midnight Rain</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
    </book> 
</catalog> 

假設我Node對象引用以價格標籤有值5.95。 Additionaly我對嵌套信息:

1 3 

說,這是第二次(從0記數)的書的目錄和標籤來回在這本書(ID =「bk102」)。

我要的是爲什麼我不能用這個簡單的方法來得到類似

xmlRawBody.indexOf("<price>5.95</price>"). 

?因爲有可能相同的標籤會出現在其他地方。我必須使用提到的附加嵌套信息。

+0

只是想知道你爲什麼想知道一個給定節點的xml文件的字符的數據流中的位置? – gigadot

+0

在編輯 –

+1

選擇它據我知道,因爲當你想操作DOM對象不需要他們,有關位置的信息的XML解析後丟失。大多數XML編輯器使用較低級別的解析器來處理這個問題,例如,帶有XML語法的ANTLR。 – gigadot

回答

2

我的理解是,你有如2 1 0的信息。由此,您正在創建節點root-child2-child1-chile0的名稱。

要獲得像這樣的指定節點,如果結構是固定的,那麼你可以從中創建一個xpath。

例如,如果您的值爲2 1 0,那麼請構建xpath,如root/root-child2/root-child2-child1/root-child2-child1-child0。您可以使用此xpath來獲取特定的節點元素。

您可以創建一個java函數,它根據相應的給定數組值來準備xpath。如果你有更多這樣的元素,你需要找到一種方法來用xpath來識別它們。由於的XPath很容易獲取使用SAXParser(如果你不想讀取整個XML,只有一部分,然後使用SAXParser)這樣的值。

希望這會有所幫助。

+0

不幸的是,這與節點名稱無關。我已經有Node對象,我正在尋找,並且我有嵌套信息。最後一個輸入是String XML主體。我想得到的是起始節點標記的'<'符號的索引。 –

+0

我也可以獲得關於節點名稱的信息。但我不確定XPath是否可以幫助我找到字符串索引。 –

+0

爲了我的理解,您是否想要將XML分成幾部分?或者想從中讀取一些XML塊?你能解釋一下嗎,這樣我就可以把它聯繫起來...... thx – Parth

0

將您的陣列到XPath和使用您所選擇的XPath引擎。例如2 1 0將變爲:/*[3]/*[2]/*[1]。請注意,XPath位置是基於1的,所以你必須添加一個到每個索引...

此外,XPath引擎將返回一個DOM節點,你可以做任何你想要的。獲取此節點的字符或字節偏移不是DOM和XPath規範的一部分,因此它取決於實現。在大多數情況下,你不能這樣做,因爲在大多數你不在乎的應

+0

正如我之前說過,我已經**有**節點引用,所以通過XPath獲取它是完全不必要的 –