我有两个XML文件:1.合同
<?xml version="1.0" encoding="UTF-8"?>
<File>
<Contract>
<ContractNo>1</ContractNo>
</Contract>
<Contract>
<ContractNo>2</ContractNo>
</Contract>
</File>
2.资产
<?xml version="1.0" encoding="UTF-8"?>
<File>
<Asset>
<ContractNo>1</ContractNo>
<SomeData>XXXX</SomeData>
<SomeData2>XXXX</SomeData2>
</Asset>
<Asset>
<ContractNo>1</ContractNo>
<SomeData>YYYY</SomeData>
<SomeData2>YYYY</SomeData2>
</Asset>
<Asset>
<ContractNo>2</ContractNo>
<SomeData>ZZZZ</SomeData>
<SomeData>ZZZZ</SomeData>
</Asset>
</File>
合同可能具有一项或多项资产。XML文件由合同编号映射。我将合并这两个文件并创建以下xml
<?xml version="1.0" encoding="UTF-8"?>
<File>
<Contract>
<ContractNo>1</ContractNo>
<Asset>
<SomeData>XXXX</SomeData>
<SomeData2>XXXX</SomeData2>
</Asset>
<Asset>
<SomeData>YYYY</SomeData>
<SomeData2>YYYY</SomeData2>
</Asset>
</Contract>
<Contract>
<ContractNo>2</ContractNo>
<Asset>
<SomeData>ZZZZ</SomeData>
<SomeData2>ZZZZ</SomeData2>
</Asset>
</Contract>
</File>
我的方法是迭代合约xml的每个合约并找到合约编号,然后迭代资产xml并找到上述合约的资产节点并将它们合并到合约xml中
XmlNodeList contractsNodeList = contractsDocument.GetElementsByTagName("Contract");
string contractNumber;
foreach (XmlNode contractNode in contractsNodeList)
{
//get the contract number
contractNumber = contractNode.SelectSingleNode("ContractNo").InnerText;
if (!String.IsNullOrEmpty(contractNumber))
{
XmlNodeList assetsNodeList = assetsDocument.GetElementsByTagName("Asset");
foreach (XmlNode assetNode in assetsNodeList)
{
//checking whether the current asset node has the current contract number
if (assetNode.ChildNodes[0].InnerText == contractNumber)
{
//remove the contract number of the asset node
assetNode.RemoveChild(assetNode.ChildNodes[0]);
//append the asset element to the contract xml
contractNode.AppendChild(contractNode.OwnerDocument.ImportNode(assetNode, true));
}
}
}
}
此代码有效并生成所需的xml。但是效率不高。我在使用XML方面没有太多经验。请让我知道其他方法。谢谢!
我将亲自阅读资产,然后填充ILookup<int, XElement>
和删除ContractNo
元素(因为在LINQ to XML中它稍微简单一些)。然后阅读合同,从字典中填充资产。就像是:
XDocument assets = XDocument.Load("assets.xml");
var lookup = assets.Root.Elements("Asset")
.ToLookup(x => (int) x.Element("ContractNo"));
assets.Root.Elements("Asset").Elements("ContractNo").Remove();
XDocument contracts = XDocument.Load("contracts.xml");
foreach (var contract in contracts.Root.Elements("Contract").ToList())
{
var id = (int) contract.Element("ContractNo");
contract.Add(lookup[id]);
}
contracts.Save("results.xml");
请注意,这不会检测没有任何资产的合同-它们将照原样保留。
所有这些都可以在“旧” XmlDocument
API中完成,但是LINQ to XML确实使它变得更加简单。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句