Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中读取此XML?_C#_Xml_Xml Parsing - Fatal编程技术网

如何在C#中读取此XML?

如何在C#中读取此XML?,c#,xml,xml-parsing,C#,Xml,Xml Parsing,我有这个XML文件。只有一排。 我需要从文件路径读取文件,并将信息添加到单独的字符串中 (日期、总计、分部、状态和计数器) 目前,我阅读的XML文件如下: var xml = System.Xml.Linq.XDocument.Load(@pathXML); 我在C#很笨,但我需要解决这个问题 XML文件: <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

我有这个XML文件。只有一排。 我需要从文件路径读取文件,并将信息添加到单独的字符串中 (日期、总计、分部、状态和计数器)

目前,我阅读的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>


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

您可以这样做:获取
节点,然后获取其第一个(也是唯一一个)子节点,然后从该节点中,使用此代码从属性中提取信息:

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在评论中所指出的那样-如果您使用的.NET区域性使用点(
)以外的其他内容作为小数分隔符,则此代码将无法正确转换表示
小数
值的字符串

要检查十进制分隔符是什么,请使用以下命令:

CultureInfo.CurrentCulture.Number.CurrencyDecimalSeparator
在这种情况下,要将XML数据正确转换为十进制,请使用:

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

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

XmlDocument xml = new XmlDocument();
xml.Load( @yourxmlfilenamepathhere);
XmlElement field = (XmlElement)xml.SelectSingleNode( "//ROWDATA/ROW" );
代码的其余部分是相同的


好处是,它不会破坏大多数XML结构更改,而且XPath方法更简单,特别是当您深入查看嵌套XML时。

效果很好,谢谢@marc_s你为什么喜欢
int.Parse(field.Attribute(“status”).Value)
而不是更简洁的
(int)field.Attribute(“status”)
(参见)?@KlausGütter:不,不是真的-我只是更习惯于general@marc_s对于十进制属性,如果当前区域性具有除“.”以外的十进制分隔符,则您的实现是不正确的。@KlausGütter:感谢您的提示-使用
de
区域性进行检查和验证,并相应地更新了我的响应。