2012-02-14 13 views
0

我現在有一個XML結構看起來像這樣的XDocument AncestorAndSelf

<Parent> 
<Info> 
    <Info-Data></Info-Data> 
    <Info-Data2></Info-Data2> 
</Info> 
<Message> 
    <Foo></Foo> 
    <Bar></Bar> 
</Message> 
<Message> 
    <Foo/> 
    <Bar/> 
</Message> 
</Parent> 

我試圖做到的是每個消息拆分成它自己獨特的XDocument。我希望它是

<Parent> 
<Info /> 
<Message /> 
</Parent> 

我試圖做到以下幾點。

XDocument xDoc = XDocument.Parse(myXMLString); 

IEnumerable<XElement> elements = xDoc.Descendants(xDoc.Root.Name.NameSpace + "Message"); 

foreach(XElement element in elements) 
{ 
    XDocument newDoc = XDocument.Parse(element.ToString()); 
} 

顯然這隻能讓我從消息和下面的一切。我嘗試使用祖先和祖先,但他們總是包括兩個消息。有沒有不同的電話我應該做?

+0

你所需要的信息元素的內容還是隻有它的存在? – 2012-02-14 16:25:32

+0

我更願意抓取Info元素的內容。 – 2012-02-14 16:28:19

+0

還有什麼?或者只是那些? – 2012-02-14 16:28:52

回答

1

如果你的格式是固定的這個樣子,這不是那麼糟糕:

foreach(XElement element in elements) 
{ 
    XDocument newDoc = new XDocument 
     (new XElement(xDoc.Root.Name, 
      xDoc.Root.Element("Info"), 
      element)); 
    // ... 
} 

這不是很大,但它並不可怕。另一種方法是克隆原始文件,刪除所有信息元素,然後反覆克隆「燒燬」的版本,每次添加一個元素到新克隆:

XDocument gutted = new XDocument(xDoc); 
gutted.Descendants(xDoc.Root.Name.Namespace + "Message").Remove(); 

foreach(XElement element in elements) 
{ 
    XDocument newDoc = new XDocument(gutted); 
    newDoc.Root.Add(element); 
    // ... 
} 
+0

謝謝!我會檢查這些 - 我確信其中的一個將滿足我的需求。 給自己的提示:買一本Jon Skeet的書 – 2012-02-14 16:35:16