XmlReader类中的`ReadString`对`ReadContentAsString`有什么区别?

时间:2014-01-18 03:25:39

标签: c# .net xmlreader

我注意到在一些开源代码中使用System.Xml.XmlReader.ReadString()来解析Xml。但当我试图在控制台应用程序中使用它只是为了检查它(我天生就是好奇的女孩)当我按.XmlReader类实例变量时,我没有得到任何智能感知。

我非常好奇,并使用 ILDASM 检查了MSIL。就在那时我注意到这个类方法用

修饰

[EditorBrowsable(EditorBrowsableState.Never)]

还注意到我对ReadString()的调用已转换为另一个名为ReadContentAsString的方法。我能够在MSDN上找到关于Microsoft程序员做出此决定的原因的零文档。

任何?我真的想知道,所以我在生产代码中调用了正确的方法。

同样不希望任何未来的开发人员看到我的代码将我视为假人,因为我是女孩和开发人员(我在高度男性主导的职业中看到的罕见组合;)

1 个答案:

答案 0 :(得分:0)

您应该先仔细阅读两个功能的官方文档:

ReadString()

以字符串形式读取元素或文本节点的内容。但是,我们建议您改用ReadElementContentAsString方法,因为它提供了一种更直接的方式来处理此操作。

ReadContentAsString()

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()将跳过它,跳至下一个单元格。