2009-11-15 63 views
1

我的XML文檔如下 -XML遍歷,複製單元和節點使用LINQ to XML

<?xml version="1.0" encoding="utf-8"?> 
<Parents> 
    <Parent id="A" description="A is a parent"> 
     <Children> 
      <ChildName name = "Son1ofA" /> 
      <ChildName name = "Son2ofA" /> 
     </Children> 
    </Parent> 
</Parents> 

要求 -

  1. 爲了識別元素 「父」,克隆它。將屬性ID更改爲「B」。將其添加爲自己的兄弟(使其成爲「父母」的新孩子)。
  2. 輸出文件是如下 -

    <Parents> 
    <Parent id="A" description="A is a parent"> 
        <Children> 
         <ChildName name = "Son" /> 
         <ChildName name = "Daughter" /> 
        </Children> 
    </Parent> 
    <Parent id="B" description="A is a parent"> 
        <Children> 
         <ChildName name = "Son" /> 
         <ChildName name = "Daughter" /> 
        </Children> 
    </Parent> 
    

我的代碼

XDocument myXMLDocument = XDocument.Load("File.xml"); 
XElement myParentsElement = myXMLDocument.Element("Parents"); 
XElement myFirstParentElement = myParentsElement.Element("Parent"); 
XElement myNewParentElement = new XElement(myFirstParentElement); 
XAttribute myParentId = myNewParentElement.Attribute("id"); 
myParentId.Value = "B"; 
myFirstParentElement.AddAfterSelf(myNewParentElement); 
myXMLDocument.Save("NewFile.xml"); 

而且這工作完全正常,沒有任何問題。顯然,這不是一個好的編程。因爲我提取元素父母,然後使用它作爲根節點,我提取父等,

我想要能夠做的就是這樣 - 直接鍵入路徑 - 作爲在/ Parents/Parent(XPath)中,提取該特定節點,複製它,修改其屬性,將其添加爲兄弟並保存文檔。

我在做些傻事嗎?

回答

3

我不會說,你正在做的事情「傻」,但有辦法克隆一個節點,並修改它與LINQ一個更精簡的方式。根據你的目標是什麼,你可以使用一個函數來修改節點和一些方便的LINQ表達式來克隆它。這是基於一個例子,你在前面已經做了什麼:

 XDocument doc = XDocument.Parse(@"<?xml version='1.0' encoding='utf-8'?> 
     <Parents> 
      <Parent id='A' description='A is a parent'> 
        <Children> 
          <ChildName name = 'Son1ofA' /> 
          <ChildName name = 'Son2ofA' /> 
        </Children> 
      </Parent> 
     </Parents> 
     "); 

     Func<XElement, XElement> trans = (x) => { 
      char c = Convert.ToChar(x.Attribute("id").Value); 
      int inc = (int)c; 
      x.Attribute("id").Value = Convert.ToChar(++inc).ToString(); 
      return x; 
     }; 
     string elementTarget = "Parent"; // assume you read this from some input 
     doc.Root.ReplaceWith(new XElement(doc.Root.Name, 
           doc.Descendants(elementTarget).Select(p => p), 
           doc.Descendants(elementTarget).Select(p => trans(p)))); 

     Console.Write(doc); 
     Console.ReadLine(); 

你可以看到邏輯在「反式」匿名函數和能力轉化到使用後裔LINQ枚舉任意選擇一個節點。這個解決方案有點脆弱,但也許會給你一些想法。

2

如果你想在Linq-to-xml中使用XPath,這裏有一些擴展方法可以幫助你。

using System.Xml.XPath; 

XDocument.Load("file name").XPathSelectElement("XPath");