【问题标题】:Group XML nodes with the same name under the same container node [closed]在同一容器节点下将具有相同名称的 XML 节点分组[关闭]
【发布时间】:2016-06-06 15:39:45
【问题描述】:

我正在使用 C# 在 Visual Studio 中开发一个应用程序。该应用程序从JSON 转换为XML。转换后,在某些情况下,我会收到这样的XML。

<root>
    <row>
        <id>0001</id>
        <type>donut</type>
        <name>Cake</name>
        <ppu>0.55</ppu>
        <topping>
            <id>5001</id>
            <type>None</type>
        </topping>
        <topping>
            <id>5002</id>
            <type>Glazed</type>
        </topping>
        <topping>
            <id>5005</id>
            <type>Sugar</type>
        </topping>
        <topping>
            <id>5007</id>
            <type>Powdered Sugar</type>
        </topping>
        <topping>
            <id>5006</id>
            <type>Chocolate with Sprinkles</type>
        </topping>
        <topping>
            <id>5003</id>
            <type>Chocolate</type>
        </topping>
        <topping>
            <id>5004</id>
            <type>Maple</type>
        </topping>
    </row>
</root>

如您所见,有几个同名的节点,我想要这个XML 输出。

 <root>
    <row>
        <id>0001</id>
        <type>donut</type>
        <name>Cake</name>
        <ppu>0.55</ppu>
        <toppings>
            <topping>
                <id>5001</id>
                <type>None</type>
            </topping>
            <topping>
                <id>5002</id>
                <type>Glazed</type>
            </topping>
            <topping>
                <id>5005</id>
                <type>Sugar</type>
            </topping>
            <topping>
                <id>5007</id>
                <type>Powdered Sugar</type>
            </topping>
            <topping>
                <id>5006</id>
                <type>Chocolate with Sprinkles</type>
            </topping>
            <topping>
                <id>5003</id>
                <type>Chocolate</type>
            </topping>
            <topping>
                <id>5004</id>
                <type>Maple</type>
            </topping>
        </toppings>
    </row>
</root>

使用C#,如何将同名的节点分组到一个容器节点下?

【问题讨论】:

  • 您想如何准确地对它们进行分组?
  • 我想为这些节点创建一个容器节点。对不起,我没有提到
  • 你可以添加一个显示结果应该如何显示的 xml 吗?
  • 到目前为止你尝试过什么?你的预期输出是什么?容器叫什么?它只是为了打顶,还是任何不止一次出现的元素?所有元素都必须是兄弟姐妹吗?
  • 我刚刚添加了一个输出示例。容器必须是通用名称,不管它有什么名称。对于每组节点,它必须相同。例如,如果我有另一个像“topping”这样的组,我想将它们分组到另一个容器节点下。

标签: c# xml visual-studio json.net


【解决方案1】:
var doc = XDocument.Parse(xml); // or XDocument.Load(filename);

var toppings = doc.Root.Element("row").Elements("topping").ToList();

toppings.Remove();

doc.Root.Element("row").Element("ppu").AddAfterSelf(new XElement("toppings", toppings));
// in the doc we have resulting xml

好的,每个案例都试试这个。

var doc = XDocument.Parse(xml); // or XDocument.Load(filename);
traverse(doc.Root);
void traverse(XElement elem)
{
    foreach (var e in elem.Elements())
    {
        traverse(e);
    }

    var groups = elem.Elements().GroupBy(e => e.Name);
    foreach (var g in groups)
    {
        if (g.Count() > 1)
        {
            var sameNodes = g.ToList();
            sameNodes.Remove();
            elem.AddFirst(new XElement(g.Key + "s", sameNodes));
        }
    }
}

此代码不保留元素的顺序。它总是在开头插入一组具有相同名称的节点。

【讨论】:

  • 这几乎是我正在寻找的,但它只适用于这种情况。我怎么能为每种情况都这样做?感谢您的回答
  • @FranciscoFischer - 查看更新。
  • 谢谢!它是这样工作的
猜你喜欢
  • 1970-01-01
  • 2012-09-02
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多