拆分xml文件并保留父节点信息

时间:2011-01-28 18:43:19

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

无论如何,无论是使用LINQ,XmlDocument等,我都可以将一个大的xml文件拆分成更小的chuck并保留所有父节点值

示例XML

<Inventory>
   <Dealer>
       <ID>123</ID>
       <Phone>1235551234</Phone>
       <Units>
          <Unit>
             <Year>
             <Make />
             <Model />
          </Unit>
          <Unit>
             <Year />
             <Make />
             <Model />
          </Unit>
      </Units>
  </Dealer>
   <Dealer>
       <ID>124</ID>
       <Phone>1235554321</Phone>
       <Units>
          <Unit>
             <Year />
             <Make />
             <Model />
          </Unit>
          <Unit>
             <Year />
             <Make />
             <Model />
          </Unit>
      </Units>
  </Dealer>
</Inventory>
对于在原始

中找到的每个单元节点,

Chunks应如下所示

<Inventory>
   <Dealer>
       <ID>123</ID>
       <Phone>1235551234</Phone>
       <Units>
          <Unit>
             <Year>
             <Make />
             <Model />
          </Unit>
       </Units>
  </Dealer>
</Inventory>

我应该澄清一个问题,我正在尝试以“单元”节点开始以编程方式构建块。没有知道父元素中可能包含的内容。

到目前为止,我的解决方案是

XDocument document = XDocument.Load("sample.xml");
var units = document.Descendents("Unit").ToList();
foreach (XElement unit in units) 
{
    XElement parent = unit;
    XElement child  = parent;
    while (null != parent.Parent) 
    {
        parent = parent.Parent;
        parent.Descendents(child.Name).Remove();
        parent.Add(child);
        child = parent;
    }
} 

这适用于每个经销商节点中的第一个单元,该经销商的每个后续单元丢失任何父信息,并且该块仅包含单元节点。

2 个答案:

答案 0 :(得分:1)

您可以使用LINQ to XML + LINQ to Objects执行此操作,为清楚起见,我将解决方案分为三个部分:首先选择单个单元,然后选择突变,然后选择分块:

 //load test xml
XDocument doc = XDocument.Load(@"test.xml");

//select
var units = doc.Descendants("Unit")
               .Select(unit => new { Unit = unit, Dealer = unit.Parent.Parent })
               .ToList();

//mutate
units.ForEach(unit => 
              { 
                  unit.Dealer.Descendants("Unit").Remove(); 
                  unit.Dealer.Element("Units").Add(unit.Unit); 
              });

//Split into chunks
var chunks = units.Select( unit => new XDocument(new XElement("Inventory", unit.Dealer)))
                  .ToList();

答案 1 :(得分:0)

使用selectSingleNode或selectNodes方法选择一个节点,并将其从xml文档中删除。