合并两个 XDocument
Merge two XDocument
我有两个xml,我要合并一个特定的节点
这是第一个:
<ContactEmployees>
<row>
<Name>NAME</Name>
<Position>Mag</Position>
<Phone1>number</Phone1>
<E_Mail>mail</E_Mail>
<InternalCode>11</InternalCode>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<FirstName>Tizio</FirstName>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
</ContactEmployees>
这是第二个:
<ContactEmployees>
<row>
<CardCode>1000010</CardCode>
<Name>NAME</Name>
<Position>Mag</Position>
<Phone1>number</Phone1>
<E_Mail>mail</E_Mail>
<InternalCode>11</InternalCode>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
<row>
<CardCode>1000010</CardCode>
<Name>Prova</Name>
<InternalCode>2703</InternalCode>
<PlaceOfBirth>-1</PlaceOfBirth>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<FirstName>Prova</FirstName>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
</ContactEmployees>
这是我期望合并后的结果:
<ContactEmployees>
<row>
<Name>NAME</Name>
<Position>Mag</Position>
<Phone1>number</Phone1>
<E_Mail>mail</E_Mail>
<InternalCode>11</InternalCode>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<FirstName>Tizio</FirstName>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
<row>
<CardCode>1000010</CardCode>
<Name>Prova</Name>
<InternalCode>2703</InternalCode>
<PlaceOfBirth>-1</PlaceOfBirth>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<FirstName>Prova</FirstName>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
</ContactEmployees>
我努力做到IEnumerable<XElement> merge = xdoc.Root.Descendants("ContactEmployees").Concat("ContactEmployees"));
xdoc 是我的所有 xml 文档,其中 "ContactEmployees" 节点是其中的一部分,但是 concat 方法生成一个具有三个节点的 xml 或将所有节点排队,我尝试了 union 但排除了第二个 xml 并且我不明白我该如何处理试图查看 InternalCode 属性的查询,因为我无法以任何方式修改它,所以它是唯一的?
-编辑-
我查看了一下情况,Internalcode可以不一样(都是一个数据库的数据),Name可以修改(Name,InternalCode,CardCode是我的table的key),所以其实我要合并修改同一行并从第二个 xml 添加新行,我不知道它有多可行
这是一个带有显式 foreach 循环的解决方案:
var doc = XDocument.Parse(@"<ContactEmployees>
<row>
<Name>NAME</Name>
<Position>Mag</Position>
<Phone1>number</Phone1>
<E_Mail>mail</E_Mail>
<InternalCode>11</InternalCode>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<FirstName>Tizio</FirstName>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
</ContactEmployees>");
var doc2 = XDocument.Parse(@"<ContactEmployees>
<row>
<CardCode>1000010</CardCode>
<Name>NAME</Name>
<Position>Mag</Position>
<Phone1>number</Phone1>
<E_Mail>mail</E_Mail>
<InternalCode>11</InternalCode>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
<row>
<CardCode>1000010</CardCode>
<Name>Prova</Name>
<InternalCode>2703</InternalCode>
<PlaceOfBirth>-1</PlaceOfBirth>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<FirstName>Prova</FirstName>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
</ContactEmployees>");
var employees = doc.Root;
var employees2 = doc2.Root;
foreach (var row2 in employees2.Elements("row"))
{
// the following may be adapted to whatever criterion shall be used
// to identify a record
var id2 = row2.Element("InternalCode").Value;
var row = employees.Elements("row").FirstOrDefault(r => r.Element("InternalCode").Value == id2);
if (row == null)
{
// row not found in doc, so add it
employees.Add(row2);
}
else
{
// row found; maybe update it, e.g.
var nameElement2 = row2.Element("Name");
if (nameElement2 != null)
{
var nameElement = row.Element("Name");
if (nameElement == null)
nameElement = nameElement2;
else
nameElement.Value = nameElement2.Value;
}
}
}
结果 XML 在 doc
.
我有两个xml,我要合并一个特定的节点
这是第一个:
<ContactEmployees>
<row>
<Name>NAME</Name>
<Position>Mag</Position>
<Phone1>number</Phone1>
<E_Mail>mail</E_Mail>
<InternalCode>11</InternalCode>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<FirstName>Tizio</FirstName>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
</ContactEmployees>
这是第二个:
<ContactEmployees>
<row>
<CardCode>1000010</CardCode>
<Name>NAME</Name>
<Position>Mag</Position>
<Phone1>number</Phone1>
<E_Mail>mail</E_Mail>
<InternalCode>11</InternalCode>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
<row>
<CardCode>1000010</CardCode>
<Name>Prova</Name>
<InternalCode>2703</InternalCode>
<PlaceOfBirth>-1</PlaceOfBirth>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<FirstName>Prova</FirstName>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
</ContactEmployees>
这是我期望合并后的结果:
<ContactEmployees>
<row>
<Name>NAME</Name>
<Position>Mag</Position>
<Phone1>number</Phone1>
<E_Mail>mail</E_Mail>
<InternalCode>11</InternalCode>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<FirstName>Tizio</FirstName>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
<row>
<CardCode>1000010</CardCode>
<Name>Prova</Name>
<InternalCode>2703</InternalCode>
<PlaceOfBirth>-1</PlaceOfBirth>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<FirstName>Prova</FirstName>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
</ContactEmployees>
我努力做到IEnumerable<XElement> merge = xdoc.Root.Descendants("ContactEmployees").Concat("ContactEmployees"));
xdoc 是我的所有 xml 文档,其中 "ContactEmployees" 节点是其中的一部分,但是 concat 方法生成一个具有三个节点的 xml 或将所有节点排队,我尝试了 union 但排除了第二个 xml 并且我不明白我该如何处理试图查看 InternalCode 属性的查询,因为我无法以任何方式修改它,所以它是唯一的?
-编辑- 我查看了一下情况,Internalcode可以不一样(都是一个数据库的数据),Name可以修改(Name,InternalCode,CardCode是我的table的key),所以其实我要合并修改同一行并从第二个 xml 添加新行,我不知道它有多可行
这是一个带有显式 foreach 循环的解决方案:
var doc = XDocument.Parse(@"<ContactEmployees>
<row>
<Name>NAME</Name>
<Position>Mag</Position>
<Phone1>number</Phone1>
<E_Mail>mail</E_Mail>
<InternalCode>11</InternalCode>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<FirstName>Tizio</FirstName>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
</ContactEmployees>");
var doc2 = XDocument.Parse(@"<ContactEmployees>
<row>
<CardCode>1000010</CardCode>
<Name>NAME</Name>
<Position>Mag</Position>
<Phone1>number</Phone1>
<E_Mail>mail</E_Mail>
<InternalCode>11</InternalCode>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
<row>
<CardCode>1000010</CardCode>
<Name>Prova</Name>
<InternalCode>2703</InternalCode>
<PlaceOfBirth>-1</PlaceOfBirth>
<Gender>gt_Undefined</Gender>
<Active>tYES</Active>
<FirstName>Prova</FirstName>
<BlockSendingMarketingContent>tNO</BlockSendingMarketingContent>
</row>
</ContactEmployees>");
var employees = doc.Root;
var employees2 = doc2.Root;
foreach (var row2 in employees2.Elements("row"))
{
// the following may be adapted to whatever criterion shall be used
// to identify a record
var id2 = row2.Element("InternalCode").Value;
var row = employees.Elements("row").FirstOrDefault(r => r.Element("InternalCode").Value == id2);
if (row == null)
{
// row not found in doc, so add it
employees.Add(row2);
}
else
{
// row found; maybe update it, e.g.
var nameElement2 = row2.Element("Name");
if (nameElement2 != null)
{
var nameElement = row.Element("Name");
if (nameElement == null)
nameElement = nameElement2;
else
nameElement.Value = nameElement2.Value;
}
}
}
结果 XML 在 doc
.