2017-03-31 86 views
0

我想解析出一個XML文件使用LINQ(XDocument),並有一些關於在文檔中有一個命名空間,將所有東西都擰緊。VB 2010命名空間的XML文件造成麻煩

我發現this SO question about the same thing影響元素名稱,並且我已經過去了(使用Name.LocalName屬性)。但它導致與其他功能相同的問題,例如獲取具有特定名稱的元素。例如:

在簡短的XML代碼:

<FeatureDefinitions xmlns="http://website.com/schema/features"> 
    <FeatureDefinition Name="FeatureOne" > 
     <Attributes> 
     <ListAttribute Name="TYPE" Description="MATERIAL USED."> 
      <ListItems> 
      <Item>Material 1</Item> 
      <Item>Material 2</Item> 
      <Item>OTHER </Item> 
      </ListItems> 
     </ListAttribute> 
     <ListAttribute Name="POSITION"> 
      <ListItems> 
      <Item>BEGIN</Item> 
      <Item>EDGE</Item> 
      <Item>END</Item> 
      <Item>TOE</Item> 
      <Item>TOP</Item> 
      </ListItems> 
     </ListAttribute> 
     <StringAttribute Name="NOTES" /> 
     </Attributes> 
    </FeatureDefinition> 
</FeatureDefinitions> 

然後在代碼:

Dim nodeFeatureDef as XElement = nodeFeatureDefinitions.Element("Attributes") 

那麼,什麼正在發生的是,當該命名空間包含在第一行XML,我無法獲得element("Attributes")及其關聯的節點。但是,如果我刪除第一行中的命名空間屬性,它工作正常。

有很多論壇建議VB源代碼導入命名空間,但我不能確定每個文件,這個進程將具有相同的命名空間。它通過使用Name屬性的Name.LocalName屬性工作,但我不知道如何對Elements屬性執行相同的操作。

任何想法?

謝謝!

回答

2

如果命名空間是未知的,你可以從根元素得到它:

Dim xml As XDocument = ... 
Dim ns = xml.Root.Name.Namespace 

然後,您可以使用XNamespace.GetName方法來創建一個合格的名稱,例如

Dim attrs = xml.Descendants(ns.GetName("ListAttribute")) 

如果根元素上沒有命名空間,這也應該可以。

+0

我認爲我們有一個贏家!對我的應用程序的代碼結構稍作修改,至今似乎完美無瑕。謝謝! –