基于节点拆分xml文件

时间:2013-10-13 16:24:43

标签: c# xml linq

我有一个XML文档,看起来大致如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Multiple xmlns:ns2="someNs2" xmlns="someGenericNs" xmlns:ns4="someNs4" xmlns:ns3="someNs3">
  <Single>
    <Id>60000</Id>
    <Type>Activate</Type>
    <Payload>
      <ns3:Activation>
        <ns3:Parent>
          <ns3:TypeId>113</ns3:TypeId>
          <ns3:TypeName>TestApplication</ns3:TypeName>
        </ns3:Parent>
        <ns3:Children>
          <ns3:Child>
            <ns3:Key>someKey</ns3:Key>
            <ns3:ChildTypeName>BadAppType1</ns3:ChildTypeName>
          </ns3:Child>
          <ns3:Child>
            <ns3:Key>someOtherKey</ns3:Key>
            <ns3:ChildTypeName>GoodAppType1</ns3:ChildTypeName>
          </ns3:Child>
        </ns3:Children>
      </ns3:Activation>
    </Payload>
  </Single>
</Multiple>

如果文件包含多个“子”节点,我想将其拆分为更多文件,每个现有子节点有1个文件。像这样:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Multiple xmlns:ns2="someNs2" xmlns="someGenericNs" xmlns:ns4="someNs4" xmlns:ns3="someNs3">
  <Single>
    <Id>60000</Id>
    <Type>Activate</Type>
    <Payload>
      <ns3:Activation>
        <ns3:Parent>
          <ns3:TypeId>113</ns3:TypeId>
          <ns3:TypeName>TestApplication</ns3:TypeName>
        </ns3:Parent>
        <ns3:Children>
          <ns3:Child>
            <ns3:Key>someOtherKey</ns3:Key>
            <ns3:ChildTypeName>GoodAppType2</ns3:ChildTypeName>
          </ns3:Child>
        </ns3:Children>
      </ns3:Activation>
    </Payload>
  </Single>
</Multiple>

然后是一个包含另一个“Child”节点的新XmlDoc。这可以通过LINQ实现吗?

到目前为止我的代码是:

 private bool HasMoreThanOneChild(string xml) {
          XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);

                if (doc.GetElementsByTagName("ns3:Child").Count > 1)
                {
                    return true;
                }

        return false;
    }

public List<string> DoSomething(XmlDocument doc){

if(HasMoreThanOneChild(doc.InnerXml))
return Split(doc);
}

我在那里返回了一个List,因为一旦文档被拆分,我对“InnerXML”更感兴趣。但如果可能的话,我无法实现这种分裂。

1 个答案:

答案 0 :(得分:1)

XNamespace ns="someNs3";

//get all Child elements
var childElements=doc.Descendants().Elements(ns+"Child").ToList();

//remove those child elements
doc.Descendants().Elements(ns+"Child").ToList().ForEach(x=>x.Remove());

int i=1;
foreach(var child in childElements)
{
    //add that child to children element
    doc.Descendants().Elements(ns+"Children").First().Add(child);
    //save it to new file!
    doc.Save("file"+i+".xml");
    doc.Descendants().Elements(ns+"Child").ToList().ForEach(x=>x.Remove());
    i++;
}