【问题标题】:Split xml file and retain parent node information拆分xml文件并保留父节点信息
【发布时间】:2011-01-28 18:43:18
【问题描述】:

无论如何,通过使用 LINQ、XmlDocument 等,我可以将一个大的 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>

对于原始中找到的每个 Unit 节点,块应该如下所示

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

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

【问题讨论】:

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


【解决方案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();

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2018-12-24
      相关资源
      最近更新 更多