使用c#中的标记属性按标记拆分xml

时间:2014-12-09 07:38:21

标签: c# xml split

我想将带有属性的标签的xml文件拆分为多个文件。

这是我的xml

源XML文档

<BATCH ID="131070" Date_Submitted="12/1/2014 7:36:06 AM" Date_Received="12/1/2014 7:36:06 AM" Date_Processed="12/1/2014 7:40:00 AM" UserID="PAYPINST" Error_Count="1">
  <CLAIMS Submitter="541884924" Submitter_Num="" Version="005010X223A2">
   <CLAIM Rec_ID="1" Claim_Type="Institutional" Submitter="541884924">

   </CLAIM>
   <CLAIM Rec_ID="2" Claim_Type="Institutional" Submitter="541884924">

   </CLAIM>
 </CLAIMS>
</BATCH>

我想在CLAIM分割文件。我使用了以下代码。

            XDocument doc = XDocument.Load(xmlFilePath);
            var newDocs = doc.Descendants("CLAIM")
                             .Select(d => new XDocument(new XElement("BATCH", new XElement("CLAIMS", d))));

            foreach (var newDoc in newDocs)
            {
                newDoc.Save(SplitedxmlFileName);
            }

当我运行代码时,它会给我分割文件。但它没有给我标签的属性

我引用此链接:How to Split an XML file into multiple XML Files

我想要输出这样的东西:

应拆分为两个xml文档,如下所示

1)

<BATCH ID="131070" Date_Submitted="12/1/2014 7:36:06 AM" Date_Received="12/1/2014 7:36:06 AM" Date_Processed="12/1/2014 7:40:00 AM" UserID="PAYPINST" Error_Count="1">
  <CLAIMS Submitter="541884924" Submitter_Num="" Version="005010X223A2">
    <CLAIM Rec_ID="1" Claim_Type="Institutional" Submitter="54188424">

    </CLAIM>
  </CLAIMS>
</BATCH>

2)

<BATCH ID="131070" Date_Submitted="12/1/2014 7:36:06 AM" Date_Received="12/1/2014 7:36:06 AM" Date_Processed="12/1/2014 7:40:00 AM" UserID="PAYPINST" Error_Count="1">
  <CLAIMS Submitter="541884924" Submitter_Num="" Version="005010X223A2">
    <CLAIM Rec_ID="2" Claim_Type="Institutional" Submitter="51884924">

    </CLAIM>
  </CLAIMS>
</BATCH>

如何使用属性 xml 文件拆分为标记

1 个答案:

答案 0 :(得分:1)

我试图将步骤分开。您能够区分不同的节点。所以你只需要父节点属性。假设 BATCH 的属性值为&amp; CLAIMS 对于每个xml文件始终相同。您可以尝试以下修改代码。

XDocument doc = XDocument.Load("XMLFile1.xml");
var newDocs = doc.Descendants("CLAIM")
                         .Select(d => new XDocument(new XElement("BATCH", new XElement("CLAIMS", d))));

var batch = doc.Element("BATCH");
var claims = doc.Descendants("CLAIMS");

int i = 0;
foreach (var newDoc in newDocs)
{
    foreach (XAttribute xat in batch.Attributes())
    {
        newDoc.Element("BATCH").SetAttributeValue(xat.Name, xat.Value);
    }
    foreach (XElement claim in claims)
    {
        foreach (XAttribute xat in claim.Attributes())
        {
            newDoc.Descendants("CLAIMS").ElementAt(0).SetAttributeValue(xat.Name, xat.Value);
        }
    }

    newDoc.Save(i.ToString());
    ++i;
}

如果有任何帮助,请告诉我。

修改

XDocument doc = XDocument.Load("XMLFile1.xml");
var newDocs = doc.Descendants("CLAIM")
                         .Select(d => new XDocument(new XElement("BATCH", new XElement("CLAIMS", d))));

var batch = doc.Element("BATCH");
var claims = doc.Descendants("CLAIMS");

int i = 0;
foreach (var newDoc in newDocs)
{
    batch.Attributes().All(p => { newDoc.Element("BATCH").SetAttributeValue(p.Name, p.Value); return true; });

    claims.All(p => p.Attributes().All(k => { newDoc.Descendants("CLAIMS").ElementAt(0).SetAttributeValue(k.Name, k.Value); return true; }));

    newDoc.Save(i.ToString());
    ++i;
}