使用 XmlTextReader 从元素中读取属性
Using XmlTextReader to read attributes from element
在下面的代码中,我找到了 "Undly" 元素,然后将适当的属性设置为 class。这是正确的方法吗?或者我应该创建一个新的 XElement class 然后找到属性?
我仍在学习 XMLTextReader 并希望使用最佳实践。
此外,我不确定我是应该使用接受字符串(文件路径)到 XML 文件的构造函数还是使用使用文件流的构造函数。似乎使用文件流的性能更快。
这是代码
using (var fs = new FileStream(RBMRBHTheoretical, FileMode.Open, FileAccess.Read))
{
using (var xmlReader = new XmlTextReader(fs))
{
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element)
{
if (string.Equals(xmlReader.Name, "Undly"))
{
occPLList.Add(new OccPL
{
Symbol = (string)xmlReader.GetAttribute("Sym").ToString().Trim(),
Description = (string)xmlReader.GetAttribute("Desc").ToString().Trim(),
Price = xmlReader.GetAttribute("Px") == null ? 0 : Convert.ToDecimal(xmlReader.GetAttribute("Px").ToString().Trim()),
Currency = (string)xmlReader.GetAttribute("Ccy").ToString().Trim()
});
}
}
}
}
}
public class OccPL
{
public string Description { get; set; }
public decimal Price { get; set; }
public string Currency { get; set; }
public string Symbol { get; set; }
}
这是 xml 文件:
<FIXML r="20030618" s="20040109" v="4.4" xr="FIA" xv="1" xmlns="http://www.fixprotocol.org/FIXML-4-4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://www.fixprotocol.org/FIXML-4-4 https://optionsclearing.com/components/docs/membership/dds_ref/fia_1_1/fixml-main-4-4-FIA-1-1.xsd">
<Batch>
<SecList ListTyp="109" ListID="20175" BizDt="2017-12-07">
<SecL Ccy="USD">
<Instrmt Desc="iShares S&P 100 ETF" SecTyp="OPT" SubTyp="ETO" Sym="OEF" Mult="100.0">
<AID AltID="00013" AltIDSrc="RBHP"/>
</Instrmt>
<InstrmtExt>
<Attrb Typ="101" Val="1.0000"/>
<Attrb Typ="108" Val="1.0000"/>
</InstrmtExt>
<Undly Desc="iShares S&P 100 ETF" Px="117.110000" Ccy="USD" Sym="OEF" ID="464287101" Src="1"/>
<Stip Typ="RBHMIN" Val="2.500"/>
<Stip Typ="CPMMIN" Val="3.750"/>
</SecL>
</SecList>
</Batch>
</FIXML>
因为在 FIXML 元素中有一个 XML 的 XSD,我可能会使用 XSD 从那个 class 生成一个 class xsd.exe 工具并反序列化为生成的 class 的一个实例,然后挑选出您自己的对象所需的位。 Deserializing XML to Objects in C#
走反序列化路线是高效但严格的。如果 XML 与架构不匹配,它将中断。 XmlTextReader 和 LINQ to XML 通常有点慢,但在它们可以处理的内容上更灵活。如果您打算处理大量任意 XML,您正在做的事情很好。如果您的 XML 将有一个定义良好的模式,当您可以使用 XSD 自动生成所需的一切并使用反序列化程序时,不要浪费时间编写一堆自定义反序列化代码。
在下面的代码中,我找到了 "Undly" 元素,然后将适当的属性设置为 class。这是正确的方法吗?或者我应该创建一个新的 XElement class 然后找到属性?
我仍在学习 XMLTextReader 并希望使用最佳实践。
此外,我不确定我是应该使用接受字符串(文件路径)到 XML 文件的构造函数还是使用使用文件流的构造函数。似乎使用文件流的性能更快。
这是代码
using (var fs = new FileStream(RBMRBHTheoretical, FileMode.Open, FileAccess.Read))
{
using (var xmlReader = new XmlTextReader(fs))
{
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element)
{
if (string.Equals(xmlReader.Name, "Undly"))
{
occPLList.Add(new OccPL
{
Symbol = (string)xmlReader.GetAttribute("Sym").ToString().Trim(),
Description = (string)xmlReader.GetAttribute("Desc").ToString().Trim(),
Price = xmlReader.GetAttribute("Px") == null ? 0 : Convert.ToDecimal(xmlReader.GetAttribute("Px").ToString().Trim()),
Currency = (string)xmlReader.GetAttribute("Ccy").ToString().Trim()
});
}
}
}
}
}
public class OccPL
{
public string Description { get; set; }
public decimal Price { get; set; }
public string Currency { get; set; }
public string Symbol { get; set; }
}
这是 xml 文件:
<FIXML r="20030618" s="20040109" v="4.4" xr="FIA" xv="1" xmlns="http://www.fixprotocol.org/FIXML-4-4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://www.fixprotocol.org/FIXML-4-4 https://optionsclearing.com/components/docs/membership/dds_ref/fia_1_1/fixml-main-4-4-FIA-1-1.xsd">
<Batch>
<SecList ListTyp="109" ListID="20175" BizDt="2017-12-07">
<SecL Ccy="USD">
<Instrmt Desc="iShares S&P 100 ETF" SecTyp="OPT" SubTyp="ETO" Sym="OEF" Mult="100.0">
<AID AltID="00013" AltIDSrc="RBHP"/>
</Instrmt>
<InstrmtExt>
<Attrb Typ="101" Val="1.0000"/>
<Attrb Typ="108" Val="1.0000"/>
</InstrmtExt>
<Undly Desc="iShares S&P 100 ETF" Px="117.110000" Ccy="USD" Sym="OEF" ID="464287101" Src="1"/>
<Stip Typ="RBHMIN" Val="2.500"/>
<Stip Typ="CPMMIN" Val="3.750"/>
</SecL>
</SecList>
</Batch>
</FIXML>
因为在 FIXML 元素中有一个 XML 的 XSD,我可能会使用 XSD 从那个 class 生成一个 class xsd.exe 工具并反序列化为生成的 class 的一个实例,然后挑选出您自己的对象所需的位。 Deserializing XML to Objects in C#
走反序列化路线是高效但严格的。如果 XML 与架构不匹配,它将中断。 XmlTextReader 和 LINQ to XML 通常有点慢,但在它们可以处理的内容上更灵活。如果您打算处理大量任意 XML,您正在做的事情很好。如果您的 XML 将有一个定义良好的模式,当您可以使用 XSD 自动生成所需的一切并使用反序列化程序时,不要浪费时间编写一堆自定义反序列化代码。