簡體   English   中英

解析一段XML

[英]Parsing a section of XML

我有一部分XML試圖從中提取名稱。 XML看起來像這樣:

here is the xml layout.



    <point href="/software/point/av/371/">
      <obj is="testdata/">
        <bool val="true" name="eventDetectionEnable" />
        <real val="-500.6300048828125" name="minimumValue" />
        <int val="0" name="controlClass" />
        <int val="1490" name="revision" />
        <real val="0" name="highLimit" />
        <int val="6" name="dimensionality" />
        <reltime val="PT0S" name="heartbeatInterval" />
        <enum val="event" name="notifyType" />
        <str val="Verticle Spread Pressure" name="name" />
        <real val="0" name="deadband" />
        <real val="0" name="lowLimit" />
        <str val="" name="protocolID" />
         <str val="" name="description" />
        <reltime val="PT0S" name="eventTimeDelay" />
        <real val="1" name="covIncrement" />
        <real val="7.9999995231628418" name="relinquishDefault" />
        <op name="notifyNow" />
        <real val="500.6300048828125" name="maximumValue" />
      </obj>
    </point>

我需要從行中拔出名字

<str val="Verticle Spread Pressure" name="name" />

我可以獲取所有節點的列表並讀取href標記,但下面沒有任何內容

  var data = OpenPLCfile(ofd.FileName, "pointconfig.xml");
  XmlDocument xmlDoc = new XmlDocument();
  xmlDoc.LoadXml(data);

  string xpath = "PointsConfiguration/SoftwarePoints/point";
  var nodes = xmlDoc.SelectNodes(xpath);
  foreach (XmlNode childrenNode in nodes)
  {
      string pointID = childrenNode.Attributes["href"].Value;

       Console.WriteLine(pointID)
  }

您可以通過SelectSingleNode方法在XmlNode上應用XPath表達式。

XmlNode nameNode = childrenNode.SelectSingleNode("obj/str[@name='name']/@val");
string name = nameNode.Value;

完整的例子

var data = OpenPLCfile(ofd.FileName, "pointconfig.xml");
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(data);

string xpath = "PointsConfiguration/SoftwarePoints/point";
var nodes = xmlDoc.SelectNodes(xpath);
foreach (XmlNode childrenNode in nodes)
{
    string pointID = childrenNode.Attributes["href"].Value;
    Console.WriteLine(pointID)

    XmlNode nameNode = childrenNode.SelectSingleNode("obj/str[@name='name']/@val");
    string name = nameNode.Value;
    Console.WriteLine(name);
}

如果只想從元素str獲得name屬性的值,其中val屬性的值是“垂直擴展壓力”,那么這里是解決方案:

var data = OpenPLCfile(ofd.FileName, "pointconfig.xml");

XDocument doc = XDocument.Parse(data);

var strElements = doc.Descendants("str");

var targetElement = strElements.Where(x => x.Attribute("val") != null && x.Attribute("val").Value == "Verticle Spread Pressure").FirstOrDefault();

if (targetElement != null)
{
  string name = targetElement.Attribute("name").Value;
}

System.Xml.Linq是XDocument的命名空間

使用Xml Linq,您可以獲得所有命名項的字典

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            Dictionary<string, string> dict = doc.Descendants("obj").FirstOrDefault().Elements()
                .GroupBy(x => (string)x.Attribute("name"), y => (string)y.Attribute("val"))
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM