【问题标题】:How to read this XML in C#?如何在 C# 中读取此 XML?
【发布时间】:2021-02-13 17:15:36
【问题描述】:

我有这个 XML 文件。只有一排。 我需要从文件的路径中读取文件并将信息添加到单独的字符串中 (dateJoined、totals、partials、status 和 counter)。

目前我是这样读取 XML 文件的:

var xml = System.Xml.Linq.XDocument.Load(@pathXML);

我对 C# 非常陌生,但我需要解决这个问题。

XML 文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
<DATAPACKET Version="2.0">
    <METADATA>
            <FIELDS>
                <FIELD attrname="dateJoined" fieldtype="dateTime"/>
                <FIELD attrname="totals" fieldtype="r8"/>
                <FIELD attrname="partials" fieldtype="r8"/>
                <FIELD attrname="status" fieldtype="r8"/>
                <FIELD attrname="counter" fieldtype="r8"/>
            </FIELDS>
        <PARAMS/>
    </METADATA>
    
    <ROWDATA>
        <ROW dateJoined="20201027" totals="41314.91" partials="134.55" status="2" counter="126"/>
    </ROWDATA>
</DATAPACKET>

如何在单独的变量中获取行的所有属性?

【问题讨论】:

    标签: c# xml xml-parsing


    【解决方案1】:

    您可以这样做:获取&lt;ROWDATA&gt; 节点,然后是它的第一个(也是唯一的)后代,然后从该节点中,使用以下代码从属性中提取信息:

    var field = xml.Root.Descendants("ROWDATA").Descendants().FirstOrDefault();
    
    if (field != null)
    {
        string dateJoined = field.Attribute("dateJoined").Value;
        decimal total = decimal.Parse(field.Attribute("totals").Value);
        decimal partials = decimal.Parse(field.Attribute("partials").Value);
    
        int status = int.Parse(field.Attribute("status").Value);
        int counter = int.Parse(field.Attribute("counter").Value);
    }
    

    更新:正如@KlausGütter 在 cmets 中所指出的那样 - 如果您使用的 .NET 文化使用点以外的其他内容 (.) 作为其小数分隔符,那么此代码将不会t 正确转换代表decimal 值的字符串。

    要检查小数点分隔符是什么,请使用:

    CultureInfo.CurrentCulture.Number.CurrencyDecimalSeparator
    

    在这种情况下,要将 XML 数据正确转换为 decimal,请使用:

        decimal total = (decimal)field.Attribute("totals");
        decimal partials = (decimal)field.Attribute("partials");
    

    【讨论】:

    • @marc_s 你有什么理由喜欢int.Parse(field.Attribute("status").Value)而不是更简洁的(int)field.Attribute("status")(见XAttribute cast operators)?
    • @KlausGütter:不,不是真的——我想我只是更习惯于int.Parse() 方法
    • @marc_s 对于小数属性,如果当前区域性的小数分隔符不是“.”,则您的实现不正确。
    • @KlausGütter:感谢您的提醒 - 检查并验证了 de-DE 文化并相应地更新了我的回复。
    【解决方案2】:

    作为一种更灵活的替代方法,使用 XPath。

    XmlDocument xml = new XmlDocument();
    xml.Load( @yourxmlfilenamepathhere);
    XmlElement field = (XmlElement)xml.SelectSingleNode( "//ROWDATA/ROW" );
    

    其余代码相同。

    好处是它不会因大多数 XML 结构更改而中断,而且 XPath 方法更简单,尤其是当您深入查看嵌套 XML 时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多