繁体   English   中英

C#解析XML和XElement

[英]C# Parsing XML and XElement

我有这个代码。 这也是XML的示例。 如有任何混淆,我深表歉意

<object type="node" >
    <property name="id" value="1" />
    <property name="name" value="ossvc06_node1" />
      <property name="port_id" value="50050768014062AC" />
      <property name="port_status" value="active" />
      <property name="port_speed" value="4Gb" />
  <property name="port_id" value="50050768013062AC" />
  <property name="port_status" value="active" />
  <property name="port_speed" value="4Gb" />
  <property name="port_id" value="50050768011062AC" />
 <property name="port_status" value="active" />
 <property name="port_speed" value="4Gb" />
 <property name="port_id" value="50050768012062AC" />
 <property name="port_status" value="active" />
 <property name="port_speed" value="4Gb" />
 <property name="hardware" value="8G4" />
 <property name="iscsi_name" value="iqn.1986-03.com.ibm:2145.ossvc06.ossvc06node1" />
 <property name="iscsi_alias" value="" />
 <property name="failover_active" value="no" />
 <property name="failover_name" value="ossvc06_node2" />
 <property name="failover_iscsi_name" value="iqn.1986-       .com.ibm:2145.ossvc06.ossvc06node2" />
 <property name="failover_iscsi_alias" value="" />
 <property name="front_panel_id" value="115286" />
</object>

在输入文件中,有两个类型为“节点”的对象,每个对象的属性标签具有不同的值。

在这段代码中,我正在寻找传入XML中所有类型为“ node”的对象。 有两个。 “变量节点”语句评估正确。 在调试器中,我可以看到两个XElement,它们在元素列表中似乎是正确的类型和元素。 但是,获取元素并将其分配给列表的语句具有XML中“节点”类型的两个对象的ChildElements,我不确定为什么。

//load the input file
 XDocument xdoc = XDocument.Load(_InputFile);

//get the object of type 'node'

//this code gives the results expected
// in the debugger each XElement appears to have the proper value and childElements
var nodes = from node in xdoc.Descendants("object")
                        where node.Attribute("type").Value == "node"
                        select node;

foreach (XElement nodelement  in nodes)
{  

    // problem happens here, the child elements from both  nodes get assigned to the list 
    List<XElement> nodeles = nodelement.Elements().ToList();
    Node node = NodeFactory(nodelement);

    // now assign the node to the correct IO group
    var iogrp = SVCClusters[0].IOGroups.Where(io => io.Name == node.IOGroupName);
    if (iogrp.FirstOrDefault().FirstNode == null) { iogrp.FirstOrDefault().FirstNode = node; }
    else { iogrp.FirstOrDefault().SecondNode = node; }

}

您可以在控制台应用程序中运行此程序,并告诉我您得到了什么

    static void Main(string[] args)
    {
        XDocument xdoc = XDocument.Parse("<root><object type=\"node\" ><property name=\"id\" value=\"1\" /><property name=\"name\" value=\"ossvc06_node1\" /></object><object type=\"node\" ><property name=\"id\" value=\"2\" /><property name=\"name\" value=\"ossvc06_node2\" /></object></root>");

        var nodes = xdoc.Descendants("object").Where(node => node.Attribute("type").Value == "node").ToList();

        foreach (XElement nodelement in nodes)
        {
            List<XElement> nodeles = nodelement.Elements().ToList();

            foreach (var node in nodeles)
                Console.WriteLine(node);
        }
    }

您应该有4行输出到控制台

编辑 - -

最初的问题是正在使用XPath表达式“ // property [@ name ='port_id']”。 此查询从文档根目录而不是从当前节点查询。

将XPath更改为“ property [@ name ='port_id']”或“ .//property[@name='port_id']”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM