LINQ を回避したい場合、または 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)。これをよりクリーンまたはより効率的にする方法を知っている人はコメントしてください。
編集:
「クランク」のレベルを 1 つ下げるには、次のように変更できます。
if (CompStream.Attributes["component"].Value == "Electric")
{
Console.Out.WriteLine(((System.Xml.XmlElement)CompStream.SelectSingleNode("descendant::mtS:Events", theNameManager)).InnerText;);
Console.In.Read();
}
そこには要素が1つしかなく、それinnerText
が得られるすべてだからです。