从xml集合中删除父节点

时间:2016-09-28 10:12:25

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

我试图摆脱xml中集合的父节点(使用linq-to-xml):

例如,输入xml:

<envelop>
<books>
    <book>
       <title>ABC</title>
       <publishedDate>2012-12-12</publishedDate>
       <authors>
           <author>John Smith</author>
           <author>Bob Doe</author>
       </authors>
    <book>
    <book>
       <title>XYZ</title>
       <publishedDate>2013-03-06</publishedDate>
       <authors>
           <author>Henry Blah</author>
           <author>Bob Doe</author>
       </authors>
    <book>
</books>
</envelop>

我希望结果是:

<envelop>

    <book>
       <title>ABC</title>
       <publishedDate>2012-12-12</publishedDate>
       <author>John Smith</author>
       <author>Bob Doe</author>
    <book>
    <book>
       <title>XYZ</title>
       <publishedDate>2013-03-06</publishedDate>
       <author>Henry Blah</author>
       <author>Bob Doe</author>
    <book>
</envelop>

节点:<books><authors>已消失 - 只剩下他们的孩子。

我看到了以下问题但是使用了XSLT(Remove parent nodes from xml with xslt)。想暂时远离XSLT。

2 个答案:

答案 0 :(得分:0)

        var document = XDocument.Load(validXmlFilePath);
        while (document.Descendants("authors").Any())
        {
            var x = document.Descendants("authors").First();
            x.AddAfterSelf(x.Nodes());
            x.Remove();
        }
        var result = document.Descendants("book");

答案 1 :(得分:0)

在VB中代码是

    Dim result As XElement = <envelop></envelop>

    result.Add(xe...<book>)

    For Each el As XElement In result...<author>.ToList
        el.Parent.Parent.Add(New XElement(el))
    Next

    result...<authors>.Remove()

将xe定义为

    Dim xe As XElement
    'to load from a file
    '  xe = XElement.Load("Your Path Here")

    ' for testing
    xe = <envelop>
             <books>
                 <book>
                     <title>ABC</title>
                     <publishedDate>2012-12-12</publishedDate>
                     <authors>
                         <author>John Smith</author>
                         <author>Bob Doe</author>
                     </authors>
                 </book>
                 <book>
                     <title>XYZ</title>
                     <publishedDate>2013-03-06</publishedDate>
                     <authors>
                         <author>Henry Blah</author>
                         <author>Bob Doe</author>
                     </authors>
                 </book>
             </books>
         </envelop>

结果看起来像

<envelop>
  <book>
    <title>ABC</title>
    <publishedDate>2012-12-12</publishedDate>
    <author>John Smith</author>
    <author>Bob Doe</author>
  </book>
  <book>
    <title>XYZ</title>
    <publishedDate>2013-03-06</publishedDate>
    <author>Henry Blah</author>
    <author>Bob Doe</author>
  </book>
</envelop>
相关问题