2010-06-21 142 views
1

我有以下XML結構:如何使用LINQ to XML將上述元素上方的XML元素移動?

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Root xmlns:xsi="My Program"> 
    <NotRoot Text="Hello"> 
     <SomeOption Text="Option 1" Centered="False"> 
      <SomeOption Text="Option 1.1" Centered="False"> 
       <SomeOption Text="Option 1.1.1" Centered="false"> 
        <SomeOption Text="A" Centered="false"> 
         <SpecialName Text="Blah blah" Centered="false"> 
          <Number>1</Number> 
         </SpecialName> 
        </SomeOption> 
        <SomeOption Text="B" Centered="false"> 
         <SpecialName Text="Hi" Centered="true"> 
          <SomeStrangeName>42</SomeStrangeName> 
         </SpecialName> 
        </SomeOption> 
        <SomeOption Text="C" Centered="false"> 
         <SpecialName Text="Some text here" Centered="false"> 
          <Stuff> 
           <Thing1>10</Thing1> 
           <Thing2>20</Thing2> 
           <Thing3>30</Thing3> 
          </Stuff> 
         </SpecialName> 
        </SomeOption> 
        <SomeOption Text="D" Centered="false"> 
         <SpecialName Text="Bye" Centered="false"> 
          <Things> 
           <Random1>9846516981</Random1> 
           <Random2>8784749874</Random2> 
          </Things> 
         </SpecialName> 
        </SomeOption> 
       </SomeOption> 
      </SomeOption> 
     </SomeOption> 
    </NotRoot> 
</Root> 

我想元素 「C」 上移一個位置,從而使輸出看起來像這樣:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Root xmlns:xsi="My Program"> 
    <NotRoot Text="Hello"> 
     <SomeOption Text="Option 1" Centered="False"> 
      <SomeOption Text="Option 1.1" Centered="False"> 
       <SomeOption Text="Option 1.1.1" Centered="false"> 
        <SomeOption Text="A" Centered="false"> 
         <SpecialName Text="Blah blah" Centered="false"> 
          <Number>1</Number> 
         </SpecialName> 
        </SomeOption> 
        <SomeOption Text="C" Centered="false"> 
         <SpecialName Text="Some text here" Centered="false"> 
          <Stuff> 
           <Thing1>10</Thing1> 
           <Thing2>20</Thing2> 
           <Thing3>30</Thing3> 
          </Stuff> 
         </SpecialName> 
        </SomeOption> 
        <SomeOption Text="B" Centered="false"> 
         <SpecialName Text="Hi" Centered="true"> 
          <SomeStrangeName>42</SomeStrangeName> 
         </SpecialName> 
        </SomeOption> 
        <SomeOption Text="D" Centered="false"> 
         <SpecialName Text="Bye" Centered="false"> 
          <Things> 
           <Random1>9846516981</Random1> 
           <Random2>8784749874</Random2> 
          </Things> 
         </SpecialName> 
        </SomeOption> 
       </SomeOption> 
      </SomeOption> 
     </SomeOption> 
    </NotRoot> 
</Root> 

我的「向上移動元素「按鈕可識別要移動的元素以及其上面的元素,並使用此代碼:

public void MoveElementUp(XElement xeElementToMove) 
{ 
    XElement xeElementToMoveInXML = xmlRoot.Descendants().Single(xe => xe == xeElementToMove); 
    XElement xePrevious = XElement.Parse(xeElementToMoveInXML.PreviousNode.ToString()); 

    // Do something here to put xeElementToMoveInXML before xePrevious 

    SaveXML(); 
} 

我想我可能會以錯誤的方式去解決這個問題。也許我需要將它全部解析爲普通文本,然後以某種方式移動它,然後將其轉換回XML元素?

回答

6

簡單:

  • 發現其當前的 「以前」 元素
  • 從樹上取下
  • 您發現

像這樣的元素之前將其插入:

static void MoveElementUp(XElement element) 
{ 
    // Walk backwards until we find an element - ignore text nodes 
    XNode previousNode = element.PreviousNode; 
    while (previousNode != null && !(previousNode is XElement)) 
    { 
     previousNode = previousNode.PreviousNode; 
    } 
    if (previousNode == null) 
    { 
     throw new ArgumentException("Nowhere to move element to!"); 
    } 
    element.Remove(); 
    previousNode.AddBeforeSelf(element); 
} 
+0

而downvote是因爲? – 2010-06-21 20:56:56

+0

謝謝Jon!這正是我正在尋找的,我能夠用它來讓我的程序工作!不知道爲什麼有人低估。 – Coder7862396 2010-06-21 22:34:25