.net 阅读碎片时如何处理单据类型?

wooyq4lh  于 2022-12-20  发布在  .NET
关注(0)|答案(1)|浏览(97)

我有一个xml实体的列表,我想支持和读取而不处理。因此,我创建一个自定义文档类型,我注册这些实体:

xml = "<!DOCTYPE doctypeName [\r\n   <!ENTITY nbsp \"LINE BREAK\">\r\n]>  " + xml;

然后我相应地设置实体处理:

reader.EntityHandling = EntityHandling.ExpandCharEntities;

这很好用。但是我也必须读取片段。但是当我尝试用同样的方法读取片段时,我得到了下面的错误:

// System.Xml.XmlException: 'Unexpected DTD declaration. Line 1, position 3.'

var reader = XmlReader.Create(new StringReader(xxml2), new XmlReaderSettings
{
    DtdProcessing = DtdProcessing.Parse,
    ConformanceLevel = ConformanceLevel.Fragment,
}, context);

这个片段是在普通阅读器的阅读过程中使用的,所以如果有某种上下文可以重用或者有一个子阅读器,这也可以工作。
是否有一个选项可以同时使用片段和文档类型?

dsekswqp

dsekswqp1#

确实有一个类https://learn.microsoft.com/en-us/dotnet/api/system.xml.xmlparsercontext?view=net-7.0,你可以创建并传递到XmlReader.Create()上,例如使用像https://learn. microsoft. com/de-de/dotnet/api/system. xml. xmlreader. create?view = net-7.0 #system-xml-xmlreader-create(system-string-system-xml-xmlreadersettings-system-xml-xmlparsercontext)这样的重载。
最小示例:

using System.Xml;

const string subset = "<!ENTITY nbsp '&#160;'>";

const string fragment = "This is important:&nbsp;Use a parser context.";

using (XmlReader xr = XmlReader.Create(
       new StringReader(fragment), 
       new XmlReaderSettings() { 
           ConformanceLevel = ConformanceLevel.Fragment, 
           DtdProcessing = DtdProcessing.Parse }, 
       new XmlParserContext(new NameTable(), null, "html", null, null, subset, null, null, XmlSpace.Default)))

{
    while (xr.Read())
    {
        Console.WriteLine(xr.Value);
    }

}

相关问题