9

エンティティを展開せずに 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 を作成したりするにはどうすればよいですか?

4

2 に答える 2

5

以下は私のために働いた。重要なのは、リフレクションを使用して内部プロパティの値を設定することです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);
}
于 2014-04-01T13:45:34.180 に答える
-3

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();

于 2010-10-02T11:29:44.837 に答える