我注意到在一些开源代码中使用System.Xml.XmlReader.ReadString()
来解析Xml。但当我试图在控制台应用程序中使用它只是为了检查它(我天生就是好奇的女孩)当我按.
对XmlReader
类实例变量时,我没有得到任何智能感知。
我非常好奇,并使用 ILDASM 检查了MSIL
。就在那时我注意到这个类方法用
[EditorBrowsable(EditorBrowsableState.Never)]
还注意到我对ReadString()
的调用已转换为另一个名为ReadContentAsString
的方法。我能够在MSDN上找到关于Microsoft程序员做出此决定的原因的零文档。
任何?我真的想知道,所以我在生产代码中调用了正确的方法。
同样不希望任何未来的开发人员看到我的代码将我视为假人,因为我是女孩和开发人员(我在高度男性主导的职业中看到的罕见组合;)
答案 0 :(得分:0)
您应该先仔细阅读两个功能的官方文档:
以字符串形式读取元素或文本节点的内容。但是,我们建议您改用
ReadElementContentAsString
方法,因为它提供了一种更直接的方式来处理此操作。
以
String
对象的形式读取当前位置的文本内容。
ReadString()
仅适用于两种类型的节点( text 和 element ),而ReadContentAsString()
处理一整类节点,包括 CDATA ,空白和注释,但不是元素!我认为后一种方法过于笼统,令人困惑,其处理不同节点类型的规则以及需要将读取放在内部而不是开始于。
我认为ReadString()
是一种更方便的方法,因为只需要将阅读器放在元素的开头即可阅读其内容。我认为使用ReadElementContentAsString()
的建议是不合理的,因为建议的方法是
读取开始标签,元素的内容,并将阅读器移到结束元素标签之外。
如您所见,它是不对称的,并且会自动跳过结束标记,将阅读器放在随后的节点上。此行为可能会轻易破坏某些简单的模式,例如通过选择性阅读进行扫描。考虑下面的代码,该代码扫描 XML 文件中的一系列“单元”元素,并仅读取将某些属性设置为值ReadMe!
string attrib;
string content;
while( NextCell( reader, out attrib ) )
{ if( attrib != "ReadMe!" ) continue;
ReadCell( reader, out content );
}
就我而言,NextCell()
将阅读器留在单元格元素的开头或返回false。 ReadCell()
始终将阅读器留在最后一次读取的单元格元素的结束标记处。它使用ReadString()
来做到这一点。如果它使用ReadElementContentAsString()
,则阅读器将留在下一个单元格的开头,而NextCell()
将跳过它,跳至下一个单元格。