如何使用Linq将子节点移动到XML

本文关键字:移动 XML 子节点 何使用 Linq | 更新日期: 2023-09-27 18:09:08

可能重复:
LINQ到XML新手:将节点从一个节点移动到另一个

我有以下XML,它是使用由XElements组成的XDocument生成的,但我在格式化XML时遇到了问题:

这就是我现在拥有的:

<Root>
 <Companies>
  <Company>
   <ID>1</ID)
   <Name>Kalle</Name>
   <RegNo>1111</RegNo>
  </Company>
 </Companies>
 <Companies>
  <Company>
   <ID>1</ID)
   <Name>Kalle</Name>
   <RegNo>1112</RegNo>
  </Company>
 </Companies>  
</root>

这就是我想要的:

   <Root>
    <Companies>
      <Company>
       <ID>1</ID)
       <Name>Kalle</Name>
       <RegNo>1111</RegNo>
       <RegNo>1112</RegNo>
      </Company>
    </Companies>  
   </Root>

我想做的是将所有类似条目/帖子移动到类似节点。这部分代码:

XElement xmlTree = new XElement("Root", File.ReadAllLines("C:''Data.txt")
         .Select
         (
             line =>
             {
                 var split = line.DelSplit();
                 return new XElement("Companies",
                     new XElement("Company", split[0]),
                     new XElement("ID",
                     new XElement("Name",
                     new XElement("RegNo", split[1])
              );

             }

         )
XDocument Xdoc = new XDocument(xmlTree);
Xdoc.Save("c:''Data.xml");

这是我想合并的原始来源:

<Club>
    <ID>A</ID>
    <ContractYears>
      <ContractYear>
        <Year>2011</Year>
        <Owners>
          <Owner>
            <OwnerName>Walt Disney</OwnerName>
            <RegistrationNumber>131313</RegistrationNumber>
            <Vessels>
              <Vessel>
                <VesselName>Alpha</VesselName>
                <Status>A</Status>
                <DateAttached></DateAttached>
                <BrokerName></BrokerName>
                <Currencies>
                  <Currency>
                    <CurrencyCode></CurrencyCode>
                    <TotalValue></TotalValue>
                    <InterestSplits>
                      <InterestSplit>
                        <Number></Number>
                        <Amount></Amount>
                      </InterestSplit>
                    </InterestSplits>
                  </Currency>
                </Currencies>
              </Vessel>
            </Vessels>
          </Owner>
        </Owners>
      </ContractYear>
    </ContractYears>
  </Club>
  <Club>
    <ID>A</ID>
    <ContractYears>
      <ContractYear>
        <Year>2011</Year>
        <Owners>
          <Owner>
            <OwnerName>Walt Disney.</OwnerName>
            <RegistrationNumber>131313</RegistrationNumber>
            <Vessels>
              <Vessel>
                <VesselName>Beta</VesselName>
                <Status></Status>
                <DateAttached></DateAttached>
                <BrokerName></BrokerName>
                <Currencies>
                  <Currency>
                    <CurrencyCode></CurrencyCode>
                    <TotalValue></TotalValue>
                    <InterestSplits>
                      <InterestSplit>
                        <Number></Number>
                        <Amount></Amount>
                      </InterestSplit>
                    </InterestSplits>
                  </Currency>
                </Currencies>
              </Vessel>
            </Vessels>
          </Owner>
        </Owners>
      </ContractYear>
    </ContractYears>
  </Club>
  <Club>

如何使用Linq将子节点移动到XML

如果您想从文本文件中创建正确的XML,您需要向我们展示文本文件中的数据外观。假设你想操作现有的XML,你可以通过LINQ分组和LINQ到XML来实现,例如

            XDocument input = XDocument.Parse(@"<Root>
 <Companies>
  <Company>
   <ID>1</ID>
   <Name>Kalle</Name>
   <RegNo>1111</RegNo>
  </Company>
 </Companies>
 <Companies>
  <Company>
   <ID>1</ID>
   <Name>Kalle</Name>
   <RegNo>1112</RegNo>
  </Company>
 </Companies>  
</Root>
");
            XDocument output =
                new XDocument(
                    new XElement(input.Root.Name,
                        new XElement("Companies",
                            from comp in input.Root.Elements("Companies").Elements("Company")
                            group comp by (int)comp.Element("ID") into g
                            select new XElement("Company",
                                new XElement("ID", g.Key),
                                g.Elements("Name").First(),
                                g.Elements("RegNo")
                            ))));
            output.Save(Console.Out);

输出

<Root>
  <Companies>
    <Company>
      <ID>1</ID>
      <Name>Kalle</Name>
      <RegNo>1111</RegNo>
      <RegNo>1112</RegNo>
    </Company>
  </Companies>
</Root>

如果您想在从文本文件中读取这些行时对数据进行分组,那么LINQ"from..group by into..select"当然会非常相似。