【问题标题】:Fetch value from child's child nodes从子节点的子节点获取值
【发布时间】:2017-10-16 19:38:01
【问题描述】:

我的 xml 结构如下,我尝试使用 linq to xml 获取节点。我有点卡住如何读取孩子的子节点,我也必须将所有 child2 节点值作为逗号分隔值。并且还必须读取子节点下存在的任何动态节点。 这是示例 xml。

文件 1:

<parent>
 <doc>
  <order>testorder</order>
   <preorder>yes</preorder>
    <child>
     <childs1>
      <child2>abc</child2>
      <child2>efg</child2>
     </childs1>
     <preview>current</preview>
     <provision>enable</provision>
    </child>
   </doc>
  </parent>

文件 2:

<parent>
 <doc>
  <order>testorder</order>
   <preorder>yes</preorder>
    <child>
     <preview>current</preview>
     <provision>enable</provision>
     <other>abc</other>
    </child>
  </doc>
 </parent>

我的 sudo 代码:

XDocument xdoc = XDocument.Load(file);
var customers =
from cust in xdoc.Descendants("doc")
      select new 
        {
        Title = cust.Element("order").Value,
        preorder = cust.Element("preorder").Value,
        innernode= from inner in cust.Elements("child")
                                  select new {
                                      site = (inner.Element("preview") != null) ? inner.Element("preview").Value : null,
                                      node=(inner.Element("childs1") != null) ?  string.Join(",",  from seg in inner.Elements("child2") select seg.Value) :null,
                              Should store if any extra dynamic nodes are there ,
                                     },
                         };
                          foreach(var item in customers)
                        {
                                               // read all nodes
                        }

【问题讨论】:

  • 我不明白“我必须将所有 child2 节点值以逗号分隔”的意思。 “childs1”和“child2”是谁?
  • 抱歉错过了添加包含 childs1 的 xml 文件 1

标签: c# linq linq-to-xml


【解决方案1】:

您获取child2 的代码正在尝试查看doc 的后代,但您想查看childs1 的后代。至于动态字段,您可以通过创建字典来获取与硬编码元素不匹配的任何元素,如下所示。

var customers =
    from cust in xdoc.Descendants("doc")
    select new
    {
        Title = cust.Element("order").Value,
        preorder = cust.Element("preorder").Value,
        innernode = from inner in cust.Elements("child")
                    select new
                    {
                        site = (inner.Element("preview") != null) ? inner.Element("preview").Value : null,
                        node = (inner.Element("childs1") != null) ? string.Join(",", from seg in inner.Elements("childs1").Elements("child2") select seg.Value) : null,
                        dynamicElements = inner.Elements()?.Where(e => e.Name != "preview" && e.Name != "childs1")?.ToDictionary(e => e.Name, e => e.Value)
                    },
    };

【讨论】:

  • 动态元素出现错误:匿名类型成员声明器无效。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。
  • 您是否复制了确切的代码?当您不选择名称时会发生该错误。在这种情况下,该成员有一个名称(dynamicElements)。我测试了该代码,它工作正常,您可以将代码发送到您收到此错误的位置以便我进行测试吗?
  • 从动态元素中读取值如下,这是行不通的。 foreach (var innernode in node.inner) { string a = innernode.site;字符串节点=innernode.site; OtherSpecs = innernode.dynamicElements ; }
猜你喜欢
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多