Запрет XmlTextReader от расширения сущностей - PullRequest
8 голосов
/ 17 августа 2010

Я пытаюсь прочитать документ XML без расширения сущностей, выполнить некоторые манипуляции с ним и повторно сохранить его с неразвернутыми сущностями, какими они были изначально.

При непосредственном использовании XDocument происходит сбойчтобы загрузить, выдав исключение, скажите, что у него есть нерасширенные сущности:

XDocument doc = XDocument.Load(file);  // <--- Exception
// ... do some manipulation to doc
doc.Save(file2);

Исключение: ссылка на необъявленную сущность 'entityname'.

Затем я попытался передатьXmlTextReader в конструктор XDocument, но свойство EntityHandling не имеет "без раскрытия":

XmlTextReader xmlReader = new XmlTextReader(file));
xmlReader.EntityHandling = EntityHandling.ExpandCharEntities;
XDocument doc = XDocument.Load(xmlReader);

Кроме того, я рассмотрел функцию XmlReader.Create, но MSDN говорит: "считыватели, созданные методом Create, раскрывают все сущности ".

Как создать XmlReader, который не расширяет сущности, или иметь XDocument с неразвернутыми сущностями?

Ответы [ 2 ]

4 голосов
/ 01 апреля 2014

Следующее сработало для меня.Ключ использует отражение, чтобы установить значение внутреннего свойства DisableUndeclaredEntityCheck.

XmlDocument document = new XmlDocument();
XmlReaderSettings readerSettings = new XmlReaderSettings()
{
    DtdProcessing = DtdProcessing.Ignore,
    IgnoreWhitespace = true,
};
using (XmlReader reader = XmlReader.Create(inputPath, readerSettings))
{
    PropertyInfo propertyInfo = reader.GetType().GetProperty("DisableUndeclaredEntityCheck", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
    propertyInfo.SetValue(reader, true);
    document.Load(reader);
}
0 голосов
/ 02 октября 2010

decasteljau! Самое смешное, что я нашел твой пост в поиске, как решить мою проблему. И моя проблема была связана со случаем, когда сущности вообще не решены. Так что спасибо за ответ на мой вопрос. И вот ответ на ваш вопрос: пожалуйста, используйте XmlDocument.

XDocument document = XDocument.Load("test.xml"); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; using (XmlWriter writer = XmlWriter.Create(Console.Out, settings)) { document.WriteTo(writer); } Console.WriteLine();

...