没有什么明显的。您正在寻找的重载不存在,并且 RDF/XML 解析器基础结构不允许您设置XmlReaderSettings.MaxCharactersFromEntities
.
我能够通过复制解析器的相关部分直到更改该设置来解决这个问题。请注意,这依赖于内部实现细节,因此所有私有调度都使用Reflection
.
有趣的是在CellLineOntology.RdfXmlParser.Context.Generator.ctor(Stream)
。
如果你有下面的代码,你可以打电话
var handler = new VDS.RDF.Parsing.Handlers.CountHandler();
CellLineOntology.RdfXmlParser.Load(handler, @"..\..\..\..\clo.owl");
使用您链接的文件,我得到了 1,387,097 条语句的计数。
namespace CellLineOntology
{
using System;
using System.IO;
using System.Reflection;
using System.Xml;
using VDS.RDF;
using VDS.RDF.Parsing.Contexts;
using VDS.RDF.Parsing.Events;
using VDS.RDF.Parsing.Events.RdfXml;
using VDS.RDF.Parsing.Handlers;
internal class RdfXmlParser
{
public static void Load(IRdfHandler handler, string filename)
{
using (var input = File.OpenRead(filename))
{
Parse(new Context(handler, input));
}
}
private static void Parse(RdfXmlParserContext context) => typeof(VDS.RDF.Parsing.RdfXmlParser).GetMethod("Parse", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(new VDS.RDF.Parsing.RdfXmlParser(), new[] { context });
private class Context : RdfXmlParserContext
{
private IEventQueue<IRdfXmlEvent> _queue
{
set => typeof(RdfXmlParserContext).GetField("_queue", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(this, value);
}
public Context(IRdfHandler handler, Stream input)
: base(handler, Stream.Null)
{
_queue = new StreamingEventQueue<IRdfXmlEvent>(new Generator(input, ToSafeString(GetBaseUri(handler))));
}
private static Uri GetBaseUri(IRdfHandler handler) => (Uri)typeof(HandlerExtensions).GetMethod("GetBaseUri", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new[] { handler });
private static string ToSafeString(Uri uri) => (uri == null) ? string.Empty : uri.AbsoluteUri;
private class Generator : StreamingEventGenerator
{
private XmlReader _reader
{
set => typeof(StreamingEventGenerator).GetField("_reader", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(this, value);
}
private bool _hasLineInfo
{
set => typeof(StreamingEventGenerator).GetField("_hasLineInfo", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(this, value);
}
private string _currentBaseUri
{
set => typeof(StreamingEventGenerator).GetField("_currentBaseUri", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(this, value);
}
public Generator(Stream stream)
: base(Stream.Null)
{
var settings = GetSettings();
// This is why we're here
settings.MaxCharactersFromEntities = 0;
var reader = XmlReader.Create(stream, settings);
_reader = reader;
_hasLineInfo = reader is IXmlLineInfo;
}
public Generator(Stream stream, string baseUri)
: this(stream)
{
_currentBaseUri = baseUri;
}
private XmlReaderSettings GetSettings() => (XmlReaderSettings)typeof(StreamingEventGenerator).GetMethod("GetSettings", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(this, null);
}
}
}
}