![](/img/trans.png)
[英]Parsing xml string to an xml document fails if the string begins with <?xml… ?> section
[英]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.