我试图从details.xml中读取一些XML,打开company.xml并将一些节点从details插入到company中,然后保存company.xml。这两个 XML 都位于 C:\Temp 下。
details.xml 中的所有详细信息 > 属性节点都需要进入 company.xml 中的第二个公司节点。
公司.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rootdir>
<properties>
<something></something>
<company>1234</company>
<company>{{details go here }}</company>
</properties>
</rootdir>
详细信息.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rootdir>
<details>
<properties>
<companyname>Acme Inc</companyname>
<address>100 Ocean Dr</address>
<city>LA</city>
<state>CA</state>
<zip>90210</zip>
</properties>
<properties>
<companytype>Engineering</companytype>
</properties>
<properties>
<licenseno>2024-ABC123</licenseno>
</properties>
</details>
</rootdir>
最终结果将如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rootdir>
<properties>
<something></something>
<company>1234</company>
<company>
<properties>
<companyname>Acme Inc</companyname>
<address>100 Ocean Dr</address>
<city>LA</city>
<state>CA</state>
<zip>90210</zip>
</properties>
<properties>
<companytype>Engineering</companytype>
</properties>
<properties>
<licenseno>2024-ABC123</licenseno>
</properties>
</company>
</properties>
</rootdir>
这就是我到目前为止所拥有的:
public static void TestMerge()
{
string destinationXml = "C:\\temp\\company.xml";
string sourceXml = "C:\\temp\\details.xml";
XElement xFileRoot = XElement.Load(destinationXml);
XElement xFileChild = XElement.Load(sourceXml);
var querySource = xFileChild.Element("details");
var queryDestination = xFileRoot.Element("properties");
Console.WriteLine(queryDestination);
}
我有 2 个节点,所以不知道如何将详细信息放入第二个节点中。
有什么建议吗?
请尝试利用 LINQ to XML 的以下解决方案。
c#
void Main()
{
const string companyXml = @"C:\Temp\company.xml";
const string destinationXml = @"C:\Temp\company_new.xml";
const string detailsXml = @"C:\Temp\details.xml";
// load both XML files
XDocument xdocCompany = XDocument.Load(companyXml);
XDocument xdocDetails = XDocument.Load(detailsXml);
// find a correct company
XElement company = xdocCompany.Descendants("company")
.Where(c => c.Value == "{{details go here }}").SingleOrDefault();
// get properties fragment
IEnumerable<XElement> properties = xdocDetails.Descendants("properties");
// remove textual node
company.RemoveAll();
// add a fragment
company.Add(properties);
// save final XML document
xdocCompany.Save(destinationXml);
}