【问题标题】:How to parse XML using C# when XML contains same element again?当 XML 再次包含相同的元素时,如何使用 C# 解析 XML?
【发布时间】:2013-09-07 23:44:20
【问题描述】:

我正在尝试读取一个看起来像的 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);

【问题讨论】:

    标签: c# xml xpath xml-parsing


    【解决方案1】:

    使用 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>
    

    【讨论】:

    • 我可以使用此代码检索整个标签。如何只检索值?
    • 查看我的编辑。您只需要选择元素的Value 属性
    • 我已使用 Value 属性进行检索。谢谢
    【解决方案2】:

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

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

    【讨论】:

    • 对于使用此代码,我需要了解系列,可能以上答案会有所帮助。谢谢。
    【解决方案3】:

    如果您需要所有字段,您可以使用 DGibbs answer 或尝试这样 作为一个列表。,

    将所有FIELDS 放入列表中,随心所欲。

    XDocument xml = XDocument.Load(sXMLPath);
    
    IEnumerable<XElement> elmList = xml.Descendants("FIELD");
    
    foreach (XElement elm in elmList)
    {
        // Your Logics goes Here      
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2014-10-06
      • 1970-01-01
      相关资源
      最近更新 更多