无论如何,无论是使用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;
}
}
这适用于每个经销商节点中的第一个单元,该经销商的每个后续单元丢失任何父信息,并且该块仅包含单元节点。
答案 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文档中删除。