如何单独删除第二个根元素,但我需要那个孩子

时间:2017-05-09 06:07:05

标签: c# xml

以下xml是我的输入

<units>
  <author-group>
    <root>
      <author Seq="1">
        <initials>J.</initials>
        <surname>Kim</surname>
        <given-name>Jiyeon</given-name>
      </author>
      <author Seq="2">
        <initials>k.</initials>
        <surname>Kim</surname>
        <given-name>ki</given-name>
      </author>
    </root>
  </author-group>
</units>

这里我只需删除标签,但我需要root标签子元素。

我的最终xml ,如下面的xml。

<units>
  <author-group>
    <author Seq="1">
      <initials>J.</initials>
      <surname>Kim</surname>
      <given-name>Jiyeon</given-name>
    </author>
    <author Seq="2">
      <initials>k.</initials>
      <surname>Kim</surname>
      <given-name>ki</given-name>
    </author>
  </author-group>
</units>

为此,我在下面提出了问题。 How to Remove Root Element in C#

我试过下面的代码。

XDocument document = new XDocument(author);                    
XElement firstChild = document.Root.Elements().First();
XDocument output = new XDocument(firstChild);

但是根元素没有删除。有没有其他方法可以删除根元素?不删除子元素?

2 个答案:

答案 0 :(得分:1)

const string xml = @"<units>
                <author-group>
                <root>
                    <author Seq=""1"">
                    <initials>J.</initials>
                    <surname>Kim</surname>
                    <given-name>Jiyeon</given-name>
                    </author>
                    <author Seq=""2"">
                    <initials>k.</initials>
                    <surname>Kim</surname>
                    <given-name>ki</given-name>
                    </author>
                </root>
                </author-group>
            </units>";

const string elementToRemove = "root";
const string addElementsInElement = "author-group";

var doc = XDocument.Parse(xml);

var matchingElement = doc
                        .Descendants()
                        .First(e => e.Element(elementToRemove) != null);

var innerElements = matchingElement.Elements().Elements().ToList();

doc
    .Descendants()
    .First(e => e.Element(elementToRemove) != null)
    .RemoveNodes();

doc
    .Descendants()
    .First(e => e.Element(addElementsInElement) != null)
    .Element(addElementsInElement)
    .Add(innerElements);

答案 1 :(得分:0)

在您的示例代码中

document.Root // this will point at the <author-group> element

Elements() // this will point at the <root> element

所以,当你调用First()时,你要求的是第一个元素。 我想你需要再打电话

firstChild.Elements()

然后应该包含所有元素