1

我只是试图从 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 文件。其他帖子让我无处可去。请帮忙!

4

2 回答 2

2

您可以为此尝试 LINQ2XML:

  string value = (string) (XElement.Load("http://agent.mtconnect.org/current")
            .Descendants().FirstOrDefault(d => d.Name.LocalName == "PowerState"))
于 2013-03-11T12:45:47.810 回答
0

如果您想避免使用 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你会得到它。

于 2013-03-11T13:45:42.267 回答