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 を回避したい場合、または 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が得られるすべてだからです。

于 2013-03-11T13:45:42.267 に答える