【发布时间】:2021-05-13 12:06:09
【问题描述】:
我有一个 XML 文件:
<?xml version="1.0"?>
<!DOCTYPE report SYSTEM "01.dtd" [
<!ENTITY parameter "blablabla">
]>
<report xmlns="http://tempuri.org/report"
details="Something is described ¶meter;"
></report>
我试图将此 XML 解析为一个对象,但在详细信息属性中反序列化后,我得到以下结果:“Something is describe ¶meter;”
但我想得到这个结果:“Something is describe blablabla”。
我的代码如下:
class Program
{
static void Main(string[] args)
{
ReadXMLwithDTD();
}
public static void ReadXMLwithDTD()
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.XmlResolver = new XmlUrlResolver();
settings.ValidationType = ValidationType.DTD;
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
settings.IgnoreWhitespace = true;
var files = Directory.GetFiles("../../../App_data/include/", "01.xml", SearchOption.AllDirectories);
foreach (var file in files)
{
XmlDocument xmlDoc = new XmlDocument();
using (StringReader sr = new StringReader(file))
using (XmlReader reader = XmlReader.Create(sr, settings))
{
xmlDoc.Load(file);
}
report r = DeserializeToObject<report>(xmlDoc.OuterXml);
}
Console.ReadLine();
}
public static T DeserializeToObject<T>(string xml) where T : class
{
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));
MemoryStream memStream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
return (T)ser.Deserialize(memStream);
}
private static void ValidationCallBack(object sender, ValidationEventArgs e)
{
if (e.Severity == XmlSeverityType.Warning)
Console.WriteLine("Warning: Matching schema not found. No validation occurred." + e.Message);
else // Error
Console.WriteLine("Validation error: " + e.Message);
}
}
我应该改变什么?
【问题讨论】:
-
LINQ to XML 会自动为您展开实体引用,请参阅dotnetfiddle.net/TrcgqT。是你想要的吗?从您的问题中甚至不清楚为什么要加载到中间
XmlDocument然后反序列化它的 OuterXml。
标签: c# .net xml dtd xmlserializer