2011-04-27 37 views
0

由於XML文檔:處理XML Linq中(C#):計數後代/元素和檢查計數值= X

<Root xmlns="http://foo" xmlns:bar="http://bar"> 
    <Child Name="one" bar:Type="type1" /> 
    <Child Name="two" bar:Caption="captionvalue" /> 
</Root> 

什麼是最有效的方式做到使用的XElement根(具有以下元根):

  1. 確保只有兩個子元素後裔
  2. 對於每個子元素的每個屬性,如果命名空間是http://bar然後調用BarFunction(attribute.value)否則打電話NoBarFunction(attribute.val如果我需要根據它們的名稱不同地處理Child的每個屬性(例如:用值填充一組變量)是foreach(Attribute)塊內的一個if-else on Attribute.Name的唯一選項?

上午我在假設不具備的「http://欄」該屬性正確的命名空間實際上是在一些默認的命名空間(而不是在http://foo)不像誰繼承父的命名空間如果沒有的元素合格?

我:

IEnumerable<XElement> children = root.Elements("Child"); 
// How do I test the count? And get each Child 
foreach (XAttribute attribute in child.Attributes()) 
{ 
    if (attribute.Name.Namespace.ToString() == "http://bar") 
    { 
BarFunction(attribute.Value); 
    } 
    else //Default Namespace 
    { 
     NoBarFunction(attribute.Value); 
    } 
} 
+0

沒有名稱空間前綴的屬性被認爲不屬於任何名稱空間。如果有幫助,我認爲它是「全球無名命名空間」。所以你是對的。 ''不在'http:// foo'的根名稱空間中。 – Lisa 2011-04-28 01:12:15

回答

0

使用LINQ將是最有效的方式。喜歡的東西(從內存中):

IEnumerable<XElement> results = root.Elements("child").Where(el => el.Children.Count == 2) 

,然後在你的results執行的檢查,以查看該命名空間是什麼,然後進行對方法/那些的XElement(S)。這也可以在LINQ中使用類似上面的語法完成。

對於第3點,您可以使用switch塊,這可能會更合適,但由您決定體系結構。例如。如果元素是一組預定義的值,那麼你也可以使用LINQ來填充你的變量。

+0

當你使用e1.Children.count時,會檢查每個「Child」節點是否恰好有兩個孩子? – raj 2011-04-28 16:59:26

0

API:Extensions.GetSchemaInfo

開箱思考,你想知道哪個架構屬性(或元素或......)在被宣佈

在「XML讀書」的角色。 ,這將是哪個模式驗證該節點。

驗證解析器行話時,此信息是PVSI的一部分(後驗證架構信息集)。您可以通過撥打電話等方式獲得該信息。

public static void Validate(
    this XDocument source, 
    XmlSchemaSet schemas, 
    ValidationEventHandler validationEventHandler, 
    bool addSchemaInfo 
) 

With addSchemaInfo set to true

如果addSchemaInfo爲true,則此方法使用後模式驗證信息集(PSVI)填充XML樹。

有兩個步驟用PSVI填充XML樹。

  1. 首先,註釋被添加到所有節點的樹,使您能夠調用Extensions.GetSchemaInfo或Extensions.GetSchemaInfo在樹中的元素或屬性。

  2. 其次,將在XSD中定義的默認元素和屬性添加到XML樹中。通過調用其中一個GetSchemaInfo方法,您可以確定是否從XSD添加了特定的元素或屬性作爲默認元素或屬性。