如何在 C# 中读取此 XML?
How to read this XML in C#?
我有这个 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>
如何在单独的变量中获取行的所有属性?
您可以这样做:获取 <ROWDATA>
节点,然后是它的第一个(也是唯一的)后代,然后从该节点使用以下代码从属性中提取信息:
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 文化使用点 (.
) 以外的其他东西作为其小数点分隔符,则此代码将无法正确转换表示 decimal
值的字符串。
要检查小数点分隔符是什么,请使用:
CultureInfo.CurrentCulture.Number.CurrencyDecimalSeparator
在这种情况下,要将 XML 数据正确转换为 decimal
,请使用:
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.[=11 时=]
我有这个 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>
如何在单独的变量中获取行的所有属性?
您可以这样做:获取 <ROWDATA>
节点,然后是它的第一个(也是唯一的)后代,然后从该节点使用以下代码从属性中提取信息:
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 文化使用点 (.
) 以外的其他东西作为其小数点分隔符,则此代码将无法正确转换表示 decimal
值的字符串。
要检查小数点分隔符是什么,请使用:
CultureInfo.CurrentCulture.Number.CurrencyDecimalSeparator
在这种情况下,要将 XML 数据正确转换为 decimal
,请使用:
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.[=11 时=]