2012-02-14 12 views
0

は、私は現在、私が達成しようとしているこれは何XDocument AncestorAndSelf

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

ようになり、XMLの構造は、それ自身のユニークな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()); 
} 

これは明らかに、メッセージ以降のすべてを取得します。 AncestorsとAncestorsAndSelfを使ってみましたが、常に両方のメッセージが含まれていました。私が作っておかなければならない別の電話がありますか?

+0

あなたは情報要素の内容が必要です同様に、またはその存在だけ? –

+0

私は情報要素のコンテンツも取得したいと思っています。 –

+0

他に何か?それともちょうどそれら? –

答えて

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

ありがとう!私はこれらをチェックします - 私はこれらのうちの1つが私のニーズに合っていると確信しています。 自分自身への注意:Jon Skeet本を購入する –