XDocument AncestorAndSelf

时间:2012-02-14 16:18:04

标签: c# xml linq linq-to-xml

我目前的XML结构看起来像这样

<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());
}

显然,这只能从Message和下面获取所有内容。我尝试使用Ancestors和AncestorsAndSelf,但他们总是包含两个消息。我应该做一个不同的电话吗?

1 个答案:

答案 0 :(得分:1)

如果您的格式是这样修复的,那就不是那么糟糕了:

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

它不是很好,但它并不可怕。另一种方法是克隆原始文档,删除所有Message元素,然后重复克隆“gutted”版本,并一次向新克隆添加一个元素:

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);
    // ...
}