从一个文件读取 XML,并将其部分插入到另一个 XML 中

问题描述 投票:0回答:1

我试图从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 个节点,所以不知道如何将详细信息放入第二个节点中。

有什么建议吗?

c# xml
1个回答
0
投票

请尝试利用 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.