Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c语言中使用标记属性按标记分割xml#_C#_Xml_Split - Fatal编程技术网

C# 在c语言中使用标记属性按标记分割xml#

C# 在c语言中使用标记属性按标记分割xml#,c#,xml,split,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" Su

我想按带有属性的标记将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>
当我运行代码时,它会给我一个拆分的文件。但是它没有给我标签的属性

我指的是这个链接:

我想要输出类似这样的内容:

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

1)


2)



如何通过带有属性的标记来拆分xml文件?

我已尝试分离这些步骤。您能够区分不同的节点。因此,您只需要父节点属性。假设批处理声明的属性值对于每个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;
}
如果有什么帮助,请告诉我

编辑


谢谢你的回复。它起作用了!!但是我想问一件事,有没有其他方法可以不通过属性循环来完成呢?嗨@AjayPunekar检查我的编辑。我们总是可以使用linq删除循环。只是循环很容易理解。所以我总是先喜欢他们…好的。谢谢你的帮助。
<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>
<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>
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;
}