2013-08-01 90 views
1

我有一些格式版本的XML文件需要使用C#上傳到數據庫。但是我現在不需要準確地輸入什麼級別的標籤,因爲根據xml的版本,標籤可能是內部的其他組或標籤。搜索XML文件中所有元素級別的節點

的XML文件

Ex1) 
<a> 
    <group1> 
     <tag>searched tag</tag>  
    </group1> 
    <b> </b> 
    <c> </c> 
</a> 

Ex2) 
<a> 
    <b> 
     <group1> 
      <c> 
      <tag>searched tag</tag> 
      </c> 
     </group1> 
    </b> 
</a> 

一些例子中,搜索標籤總是將1組標籤,所有的文件裏面有XMLNS和架構屬性。

我試過使用xml.SelectSingleNode(\ group1 \ tag),但在文件具有架構頭和命名空間配置時發生錯誤。

在此先感謝。

回答

2

如果您確定元素tag低於group1,並且可以有任何數量的它們之間的中間節點的水平,並假設所有的元素都在全局命名空間,然後使用:(注意斜線方向):

xml.SelectSingleNode("//group1//tag") 

然而,如果你知道xmlns的各元素都在,那麼你將需要做的,像這樣:

xml.SelectSingleNode("//*[local-name()='group1']//*[local-name()='tag']") 

注然而,對於MSXml分析器中的大文件使用'//'可能有點慢,所以它會更快,例如如果您可以隔離確切的路徑到相應的節點,然後可以使用|

例如,在您的例子,如果標籤可以是 '是' Ex1 OR Ex2,則:

/a/group1/tag | /a/b/group1/c/tag 

應該工作。

+0

我已經嘗試使用本地名稱標記像答案,但仍然有一個空的XmlNode有結果。我創建的唯一方法是使用傳遞group1名稱的xml.GetElementsByTagName(childNodeName)並搜索接收到的XMLNodeList中的標記。 –

+0

我的不好 - 我在'local-name()'之後錯過了'()' - 修正了 - 我用MsXml檢查了幾個測試文件。 – StuartLC

+1

太棒了!適用於選擇TAG值並選擇所有group1元素......謝謝 –