2011-01-28 60 views
2

反正是有,无论是使用LINQ,XmlDocument的等等,我可以分裂一个大的XML文件成较小的卡盘,并保留所有的父节点值拆分XML文件,并保留父节点信息

示例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> 

大块应该是这样的,即在原始

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

发现每个单元节点我要澄清一个问题,我想programmaticly建立开始日的块e“单位”节点。不知道父元素可能包含什么。

我的解决方案迄今

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

这个伟大的工程为每个经销商节点的第一单元,对于经销商每个后续单元丢失任何父信息和块只包含组节点。

+0

乍得,当标签中包含标题时,不需要在标题中放置“(C#)”。 – 2011-01-28 19:52:33

回答

0

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

1

你可以用LINQ这样对XML + LINQ到对象,为了清楚我的解决方案分为三个部分:第一选择以个人为单位,那么突变,然后分块:

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