【问题标题】:How can I move child nodes using Linq to XML? [duplicate]如何使用 Linq to XML 移动子节点? [复制]
【发布时间】:2011-09-22 20:53:55
【问题描述】:

可能重复:
LINQ to XML Newbie: Moving Nodes From One Node To Another

我有以下通过使用由 XElements 组成的 XDocument 生成的 XML,但是我在格式化 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>

【问题讨论】:

  • 你有任何你已经尝试过的代码示例吗?
  • 你想在一个元素中包含两个同名的 XElement ??

标签: c# xml linq-to-xml


【解决方案1】:

如果您想从您的文本文件创建正确的 XML,您将向我们展示文本文件中数据的外观。 假设您想要操作现有的 XML,您可以使用 LINQ 分组和 LINQ to 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“从 .. 分组到 .. 选择”当然会非常相似。

【讨论】:

  • 您的解决方案有效,但我在原始数据中有 25 个字段,我无法正确处理。这不是那么简单。
  • 如果您在将发布的解决方案应用于更复杂的数据时遇到问题,请向我们展示一个示例(您可以编辑您的问题)。但是我们需要同时查看您想要的输入和相应的输出。尽量减少样本以证明问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多