簡體   English   中英

如何在foreach循環中創建具有多個xelement節點的頂級xelement

[英]How to create a top level xelement with multiple xelement nodes in a foreach loop

我正在尋找創建具有多個XElement子節點的頂級XElement,如下所示。

<Names>
    <Name>
        <firstname>Mike</firstname>
        <lastname>Smith</lastname>
    </Name>
    <Name>
        <firstname>Sam</firstname>
        <lastname>Smith</lastname>
    </Name>
    <Name>
        <firstname>Michelle</firstname>
        <lastname>Smith</lastname>
    </Name>
</Names>

如果我使用類似下面的內容,如何將子元素(元素)追加到頂級元素? 感謝您的任何建議。

for (int i = 0; i < 10; i++)
{
    var str = GetName(i);
    //str is a string that contains xml
    XDocument doc = XDocument.Parse(str);
    XElement nameEle = doc.Root;

}

我將您的問題解釋為如何使用LINQ to XML( XDocumentXElement等)從某些數據創建XML元素。 LINQ to XML的構建是為了支持所謂的功能構造 ,該功能構造使您可以在單個語句中創建XML樹。 在我看來,這是創建XML元素的最佳方法,而不是改變現有結構。

要創建XML元素,您需要一些數據,並且該數據應采用IEnumerable<T>序列(LINQ的基本接口)的形式。 我的小樣本使用了一系列匿名類型:

var names = new[] {
  new { FirstName = "Mike", LastName = "Smith" },
  new { FirstName = "Sam", LastName = "Smith" },
  new { FirstName = "Michelle", LastName = "Smith" }
};

您還可以使用對函數的調用來創建IEnumerable<T>序列:

var names = Enumerable.Range(0, 10).Select(i => GetName(i));

假定GetName(i)將返回具有FirstNameLastName屬性的對象。

然后,您可以使用函數構造在單個語句中創建XML元素:

var xElement = new XElement("Names",
  names.Select(
    name => new XElement("Name",
      new XElement("FirstName", name.FirstName),
      new XElement("LastName", name.LastName)
    )
  )
);

代碼的結構和縮進反映了生成的XML,並易於理解發生了什么:

<Names>
  <Name>
    <FirstName>Mike</FirstName>
    <LastName>Smith</LastName>
  </Name>
  <Name>
    <FirstName>Sam</FirstName>
    <LastName>Smith</LastName>
  </Name>
  <Name>
    <FirstName>Michelle</FirstName>
    <LastName>Smith</LastName>
  </Name>
</Names>

我認為您應該只閱讀msdn上的一些文檔:

http://msdn.microsoft.com/zh-CN/library/system.xml.linq.xelement(v=vs.110).aspx

然后,這確實有助於滾動到底部的一個示例。

實際上,您可以更新一些新的XElement,並將它們添加到其他不一定是根元素的元素中。

您可以將每個<Name>字符串解析為XElement而不是XDocument ,例如:

var doc = XDocument.Parse("<Names></Names>");
for (int i = 0; i < 10; i++)
{
    var str = GetName(i);
    var name = XElement.Parse(str);
    doc.Root.Add(name);
}

或更喜歡使用LINQ(但可讀性較差?):

doc.Root
   .Add(
        Enumerable.Range(0, 10)
                  .Select(i => XElement.Parse(GetName(i)))
        );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM