从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文件。而其他的帖子都帮不上什么忙。请帮助!
您可以试试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
是所有你会得到的