【发布时间】:2016-03-19 08:29:08
【问题描述】:
给出以下源代码:
using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;
namespace TheXMLGames
{
class Program
{
static void Main(string[] args)
{
XmlReaderSettings settings = new XmlReaderSettings {
Async = false,
ConformanceLevel = ConformanceLevel.Fragment,
DtdProcessing = DtdProcessing.Ignore,
ValidationFlags = XmlSchemaValidationFlags.None,
ValidationType = ValidationType.None,
XmlResolver = null,
};
string head = File.ReadAllText("sample.xml");
Stream stringStream = GenerateStreamFromString(head);
// Variant 1
//XmlReader reader = XmlReader.Create(stringStream);
// Variant 2
//XmlReader reader = XmlReader.Create(stringStream, settings);
// Variant 3
XmlTextReader reader = new XmlTextReader(stringStream);
while (reader.Read())
if (reader.NodeType != XmlNodeType.Whitespace)
Console.WriteLine(reader.Name + ": " + reader.Value);
// No Variant gets here without an exception,
// but that's not the point!
Console.ReadKey();
}
public static Stream GenerateStreamFromString(string s)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position = 0;
return stream;
}
}
}
示例.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TestingFacility >
<TestingFacility id="MACHINE_2015-11-11T11_11_11" version="2015-11-11">
<Program>
<Title>title</Title>
<Steps>16</Steps>
</Program>
<Calibration>
<Current offset="0" gain="111.11" />
<Voltage offset="0" gain="111.11" />
</Calibration>
<Info type="Facilityname" value="MACHINE" />
<Info type="Hardwareversion" value="HW11" />
<Info type="Account" value="DJohn" />
<Info type="Teststart" value="2015-11-11T11:11:11" />
<Info type="Description" value="desc" />
<Info type="Profiler" value="prof" />
<Info type="Target" value="trgt" />
行为如下:
变体 1
XmlReader.Create(流)
System.Xml.dll 中出现“System.Xml.XmlException”类型的未处理异常
附加信息:出于安全原因,此 XML 文档中禁止使用 DTD。要启用 DTD 处理,请将 XmlReaderSettings 上的 DtdProcessing 属性设置为 Parse 并将设置传递给 XmlReader.Create 方法。
变体 2
XmlReader.Create(流,设置)
System.Xml.dll 中出现“System.Xml.XmlException”类型的未处理异常
附加信息:意外的 DTD 声明。第 2 行,位置 3。
变体 3
新 XmlTextReader(stringStream)
System.Xml.dll 中出现“System.Xml.XmlException”类型的未处理异常
附加信息:文件意外结束。以下元素未关闭:TestingFacility。第 19 行,位置 36。
变体 1 和 2 在第一行之后抛出。
变体 3 按预期输出整个文件,当它到达末尾时,它会抱怨(正确!)。
该软件的工作原理与我显然使用 Variant 3 一样,但(现在)推荐的方法是通过 XmlReader.Create 使用 Factory
如果我摆弄设置,它会开始变得更加奇怪。
如何获取最新代码并使用 XmlReader.Create?
完整的项目可以在这里找到: https://drive.google.com/file/d/0B55cC50M31_8T0lub25oS2QxQ00/view
【问题讨论】:
-
这是一个相关问题(不是重复的!)stackoverflow.com/questions/1551912/…
-
XmlReader 表示提供对 XML 数据的快速、非缓存、只进访问的读取器。 XmlTextReader 提供完整的功能。 XmlReader 较新,已修复 XmlTextReader 中的错误。
-
@jdweng:XmlReader 只是 XmlTextReader 的基类,允许其他派生类,例如在 DOM 上提供相同的 API。正如您所暗示的那样,它不像是另一个的固定版本。
-
我猜新类比旧版本更健壮。不是真正的错误。
-
您可能想查看 this post,其中包含一些关于
XmlTextReader与使用.Create方法创建的XmlReader的讨论。出于安全原因(DTD 扩展 DOS 攻击),默认情况下,在使用.Create()创建的XmlReader中禁用处理 DTD。
标签: c# xml xml-parsing linq-to-xml