【问题标题】:XML reading repeating child elements with same name as parent c#XML读取与父c#同名的重复子元素
【发布时间】:2013-01-18 19:47:13
【问题描述】:

我有以下格式的xml:

<rows>
   <rows>
      <primitiveValue>000</primitiveValue>
   </rows>
   <rows>
      <primitiveValue>58316</primitiveValue>
   </rows>
   <rows>
   <primitiveValue>133083.0</primitiveValue>
   </rows>
</rows>
<rows>
  <rows>
    <primitiveValue>001</primitiveValue>
  </rows>
  <rows>
    <primitiveValue>66018</primitiveValue>
  </rows>
  <rows>
    <primitiveValue>172546.0</primitiveValue>
  </rows>
</rows>

我需要按行的父元素拆分数据,但不知道该怎么做。

我已经尝试过下面的代码,但这会循环遍历行的每个实例并导致重复。

        string Values = "";

        foreach (XElement element in xDoc.Descendants("rows"))
        {

            foreach (XElement childElement in element.Descendants("rows").Elements("primitiveValue"))
            {

                Values = Values + "," + childElement.Value.ToString();

            }


        }

有人可以帮忙吗?

【问题讨论】:

  • 你能改变xml吗?如果是这样,您应该将其设为 &lt;rows&gt;&lt;row/&gt;&lt;row/&gt;&lt;/rows&gt; 而不是调用所有行。
  • 不,我不能,因为它来自谷歌分析 api。它以 JSON 格式自动返回,然后我将其转换为 XML,因为我想使用我已经设置的进程将每行的 xml 导入 SQL Server DB
  • 如果是这种情况,我建议您查看 JSON.net 以将 JSON 转换为 XML,而不是自己滚动。
  • 我已经使用 JSON.net 将其从 JSON 转换为 XML 格式。转换后的 XML 文档的上述片段部分

标签: c# xml linq linq-to-xml


【解决方案1】:

后代将找到具有您正在查找的名称的所有节点,无论它们位于 XML 树的下方多远。尝试尝试这样的事情:

foreach (XElement element in xDoc.Children("rows"))
        {
            foreach (XElement childElement in element.Descendants("rows").Elements("primitiveValue"))
            {
                Values = Values + "," + childElement.Value.ToString();
            }
        }

关键是使用 Children 应该只返回根元素正下方的节点,而不是在 XML 文档的整个结构中搜索匹配的元素。

【讨论】:

  • 谢谢。我无法找到 xdocument children 方法。我是否缺少命名空间或其他内容?
【解决方案2】:

System.Xml.XPath.Extensions很简单:

var values = xdoc.XPathSelectElements(@"//rows/rows/primitiveValue").Select(v => (double)v);
string result = String.Join(",", values);

值将是 IEnumerable&lt;double&gt; 包含原始值元素的值。结果将是所有值的串联字符串。顺便说一句,您的 xml 中缺少根元素。

更新

IEnumerable<string> result = 
             xdoc.Root.Elements("rows")
                 .Select(r => String.Join(",", r.Descendants("primitiveValue")
                                                .Select(v => (double)v)));

这将返回字符串序列,每个字符串将包含内部行的连接值。如果您需要原始字符串而不是双精度值,则将值节点转换为字符串。

【讨论】:

  • 我需要将原始值拆分为行,尽管在此示例中每行有 3 个值。我正在开发一个自动化流程,其中每行的值数量也会有所不同
  • @AlistairMcIntyre 对不起,没有得到你想要做的事情。使用您的示例 xml,此代码返回包含所有值的字符串 0,58316,133083,1,66018,172546
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多