从子节点的子节点获取值

Fetch value from child's child nodes

我有如下 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 的代码试图查看 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)
                    },
    };