[英]VDS.RDF.Parsing.RdfXmlParser Load(IRdfHandler handler, XmlDocument document) missing
我正在尋找具有上述簽名的重載。
我需要從XmlDocument
加載,因為直接從 owl 文件加載或通過 Stream 加載會導致錯誤:
“輸入文檔已超出 MaxCharactersFromEntities 設置的限制。”
有什么我不知道的明顯的東西嗎?
謝謝,揚
我嘗試解析細胞系本體(~100MB)。 因為我只需要一些特定的內容,所以我想使用處理程序來專注於有趣的東西。 為了演示我的問題,我使用CountHandler
private static void loadCellLineOntology()
{
try
{
var settings = new System.Xml.XmlReaderSettings()
{
MaxCharactersFromEntities = 0,
DtdProcessing = System.Xml.DtdProcessing.Parse
};
var doc = new System.Xml.XmlDocument();
var parser = new VDS.RDF.Parsing.RdfXmlParser(VDS.RDF.Parsing.RdfXmlParserMode.DOM);
//using (var stream = new System.IO.FileStream(@"C:\Users\jan.hummel\Downloads\clo.owl", System.IO.FileMode.Open))
//using (var reader = System.Xml.XmlReader.Create(stream, settings))
using (IGraph g = new NonIndexedGraph())
{
//doc.Load(reader);
//parser.Load(g, @"C:\Users\jahu\Downloads\clo.owl");
var handler = new VDS.RDF.Parsing.Handlers.CountHandler();
parser.Load(handler, @"C:\Users\jahu\Downloads\clo.owl");
//parser.Load(handler, doc);
}
}
catch (Exception ex)
{
Debugger.Break();
}
}
沒有什么明顯的。 您正在尋找的重載不存在,並且 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);
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.