获取xml节点C#的子属性

时间:2018-06-28 11:50:53

标签: c# .net xml

我正在尝试从xml文档的特定位置获取属性,xml看起来包含多个类似的标记名,如下所示:

 <Message dataItemId="Axis_01" timestamp="2018-06-25T20:20:40.4374489Z" 
 name="[#] Numero inversioni" sequence="85988" 
 nativeCode="208573">208573</Message>
 <Message dataItemId="Axis_02_InvDDone" timestamp="2018-06- 
  25T20:20:40.4374489Z" name="Error" sequence="85998" 
  nativeCode="208573">208573</Message>

如何仅检索名称为Error的Message的值?下面是我尝试的代码,其中textbox1 =消息,textbox2 =错误:

 XmlDocument xmldoc = new XmlDocument();
        XmlNodeList xmlnode;

        try
        {
            xmldoc.Load("http://127.0.0.1:5000/cur");
            XmlNode node2 = xmldoc.SelectSingleNode("'"+ textBox1.Text + 
            "'[name='" + textBox2.Text + "']");
               listBox1.Items.Add(node2.ChildNodes.Item(0).InnerText.Trim());

            }

2 个答案:

答案 0 :(得分:1)

您的XPath有点不正确。为了进行测试,我对值进行了硬编码:

XmlNode messageNode = xmlDoc.SelectSingleNode("//Message[@name='Error']");

我认为您将能够轻松地将硬编码值替换为来自文本框的输入。

这将是在整个Xml文档中搜索一个Message节点,该节点具有名为name且值为Error的属性。如果有多个匹配项,则SelectSingleNode将返回第一个匹配项。如果需要,有一个SelectNodes函数将返回多个值。

重要的位是:

  1. \\Message-指示XmlDocument查找Message节点
  2. @name-指示XmlDocument查找属性

当我运行它时发现:

  

<消息dataItemId =“ Axis_02_InvDDone” timestamp =“ 2018-06-25T20:20:40.4374489Z” name =“ Error” sequence =“ 85998” nativeCode =“ 208573”> 208573

我不清楚您要检索哪个属性。这将检索dataItemId属性的值

Debug.Print(messageNode.Attributes["dataItemId"].InnerText);
  

Axis_02_InvDDone

要获取该节点的Text值,即208573,请使用:

Debug.Print(messageNode.InnerText);

答案 1 :(得分:0)

下面是来自以下链接的代码:https://msdn.microsoft.com/en-us/library/system.xml.xmlnode.childnodes(v=vs.110).aspx

public class Sample {

  public static void Main() {

    XmlDocument doc = new XmlDocument();
    doc.LoadXml("<book ISBN='1-861001-57-5'>" +
                "<title>Pride And Prejudice</title>" +
                "<price>19.95</price>" +
                "</book>");

    XmlNode root = doc.FirstChild;

    //Display the contents of the child nodes.
    if (root.HasChildNodes)
    {
      for (int i=0; i<root.ChildNodes.Count; i++)
      {
        Console.WriteLine(root.ChildNodes[i].InnerText);
      }
    }
  }
}

您可以使用条件获取特定的子节点。