从XML文件中读取单个节点并将其用作条件

本文关键字:条件 节点 文件 XML 读取 单个 | 更新日期: 2023-09-27 18:03:23

我只是试图从XML中读取特定节点,并将其用作条件中的字符串变量。这样就得到了XML文件,并得到了全部内容。

string url = @"http://agent.mtconnect.org/current";
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(url);
        richTextBox1.Text = xmlDoc.InnerXml;

但是我需要"OFF"的电源状态为"ON"(下面的XML部分,可以在线查看整个XML)

<Events><PowerState dataItemId="p2" timestamp="2013-03-11T12:27:30.275747" name="power" sequence="4042868976">ON</PowerState></Events>
我已经试过了我所知道的一切。我只是不太熟悉XML文件。而其他的帖子都帮不上什么忙。请帮助!

从XML文件中读取单个节点并将其用作条件

您可以试试LINQ2XML:

  string value = (string) (XElement.Load("http://agent.mtconnect.org/current")
            .Descendants().FirstOrDefault(d => d.Name.LocalName == "PowerState"))

如果你想避免LINQ,或者如果它不适合你,你可以使用直接的XML遍历:

    string url = @"http://agent.mtconnect.org/current";
    System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
    xmlDoc.Load(url);
    System.Xml.XmlNamespaceManager theNameManager = new System.Xml.XmlNamespaceManager(xmlDoc.NameTable);
    theNameManager.AddNamespace("mtS", "urn:mtconnect.org:MTConnectStreams:1.2");
    theNameManager.AddNamespace("m", "urn:mtconnect.org:MTConnectStreams:1.2");
    theNameManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
    System.Xml.XmlElement DeviceStreams = (System.Xml.XmlElement)xmlDoc.SelectSingleNode("descendant::mtS:DeviceStream", theNameManager);
    System.Xml.XmlNodeList theStreams = DeviceStreams.SelectNodes("descendant::mtS:ComponentStream", theNameManager);
    foreach (System.Xml.XmlNode CompStream in theStreams)
    {
        if (CompStream.Attributes["component"].Value  == "Electric")
        {
            System.Xml.XmlElement EventElement = (System.Xml.XmlElement)CompStream.SelectSingleNode("descendant::mtS:Events", theNameManager);
            System.Xml.XmlElement PowerElement = (System.Xml.XmlElement)EventElement.SelectSingleNode("descendant::mtS:PowerState", theNameManager);
            Console.Out.WriteLine(PowerElement.InnerText);
            Console.In.Read();
        }
    }

在遍历根节点中具有默认名称空间的任何文档时,我发现必须使用名称空间管理器。没有它,文档就无法导航。

我在控制台应用程序中创建了这段代码。这对我很有效。我也不是大师,我可能在这里犯了一些错误。我不确定是否有某种方法可以在不命名的情况下引用默认名称空间(mtS)。谁知道如何使它更干净或更有效,请评论。 编辑:

如果想要减少一个'clunk'级别,你可以改变这个:

if (CompStream.Attributes["component"].Value  == "Electric")
{
    Console.Out.WriteLine(((System.Xml.XmlElement)CompStream.SelectSingleNode("descendant::mtS:Events", theNameManager)).InnerText;);
    Console.In.Read();
}

因为那里只有一个元素,它的innerText是所有你会得到的