当XML再次包含相同的元素时,如何使用C#解析XML?

时间:2013-09-04 12:50:34

标签: c# xml xpath xml-parsing

我正在尝试阅读一个看起来像

的XML文件
<?xml version="1.0" encoding="UTF-8"?>
<MyXML>
<SESSION FORM_ID="775938" CID="" ID="HAKKI-LAPTOP_634975758376381105">
<FIELD NAME="A001DATE_M" Y="2.32" X="5.5" WIDTH="7.15" HEIGHT="0.99">First Value</FIELD>
<FIELD NAME="A002" Y="2.32" X="17.83" WIDTH="2.38" HEIGHT="0.99">Second Value</FIELD>
<FIELD NAME="A003" Y="1.11" X="17.83" WIDTH="2.38" HEIGHT="0.99">Third Value</FIELD>
<FIELD NAME="A004" Y="1.11" X="5.5" WIDTH="2.38" HEIGHT="0.99">Fourth Value</FIELD>
</SESSION> 
</MyXML>

我正在尝试读取第三个值。 我的代码可以检索第一个值。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(sXMLPath);
XmlNode node = xmlDoc.SelectSingleNode("MyXML/SESSION/FIELD");
if (node != null)
{
     MessageBox.Show(node.InnerText);
}

为了读取第三个或第四个值,我需要做出哪些更改?

解决方案:(由@DGibbs提供)

XDocument xml = XDocument.Load(sXMLPath);
var elem = (from n in xml.Descendants("FIELD")
            where n.Attribute("NAME").Value == "A004"
            select n).FirstOrDefault();
MessageBox.Show(elem.Value);

3 个答案:

答案 0 :(得分:5)

使用LINQ to XML并按NAME属性选择:

XDocument xml = XDocument.Load(fileLocation);

var elem = (from n in xml.Descendants("FIELD")
            where n.Attribute("NAME").Value == "A004"
            select n.Value).FirstOrDefault();

请注意,您需要更新XML FIELD元素,因为它们是自动关闭的,并且还有结束标记。

示例:

<FIELD NAME="A002" Y="2.32" X="17.83" WIDTH="2.38" HEIGHT="0.99" />Second Value</FIELD>

应该是:

<FIELD NAME="A002" Y="2.32" X="17.83" WIDTH="2.38" HEIGHT="0.99">Second Value</FIELD>

答案 1 :(得分:1)

使用[3]扩展您的XPath选择器:

XmlNode node = xmlDoc.SelectSingleNode("MyXML/SESSION/FIELD[3]");

答案 2 :(得分:1)

  

如果您需要所有字段,可以使用 DGibbs回答或尝试这样做   作为清单。,

将所有FIELDS放入列表并执行任何操作。

XDocument xml = XDocument.Load(sXMLPath);

IEnumerable<XElement> elmList = xml.Descendants("FIELD");

foreach (XElement elm in elmList)
{
    // Your Logics goes Here      
}