Xmldocのinnerxmlを設定しようとしていますが、例外が発生します:宣言されていないエンティティへの参照
XmlDocument xmldoc = new XmlDocument();
string text = "Hello, I am text α – —"
xmldoc.InnerXml = "<p>" + text + "</p>";
これは例外をスローします:
宣言されていないエンティティ「alpha」への参照。行2、位置2。
この問題をどのように解決しますか?
.Netでは、System.Xml.XmlConvert
クラスを使用できます。
string text = XmlConvert.EncodeName("Hello α");
または、DOCTYPE宣言の角かっこで囲んで宣言を配置することにより、エンティティをローカルで宣言することもできます。次のヘッダーをxmlに追加します。
<!DOCTYPE documentElement[
<!ENTITY Alpha "Α">
<!ENTITY ndash "–">
<!ENTITY mdash "—">
]>
エンティティ定義については、「html文字エンティティ」でグーグルを実行してください。
&Alphaを次のように置き換えてみてください
Α
前の答えは正しいです。もう1つの方法は、htmlドキュメントをそれらの文字エンティティが定義されているDTDにリンクすることです。これは、標準のXHTMLDTD定義です。 xmlファイルには次の宣言が含まれている必要があります。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
文字列System.Net.WebUtility.HtmlDecode(string)を使用します。これにより、HTMLエンティティでエンコードされたすべての文字がUnicodeバリアントにデコードされます。 dot.netフレームワーク4から入手できます。
慣れ親しんだHTMLエンティティ名を使用したい場合は、W3Cが対応し、「文字のXMLエンティティ定義」を作成しました http://www.w3.org/TR/xml-entity -names / 。これは基本的に、HTMLにあるものと非常によく似た名前付きエンティティのリストです。ただし、前述のように、これはXMLに組み込まれていないため、これらの名前付きエンティティを使用するXMLアプリケーションで明示的にサポートする必要があります。
InnerTextを"Hello, I am text α – —"
に設定して、XmlDocumentがそれらを自動的にエスケープするようにすることもできます。おもう。
HtmlDocumentの使用は私の状況には適していませんでした。私たちのシステムには、xmlのロードに使用したカスタムXmlUrlResolverがありました。
//setup
public class CustomXmlResolver : XmlUrlResolver { /* ... */ }
String originalXml; //fetched xml with html entities in it
var doc = new XmlDocument();
doc.XmlResolver = new AdCastXmlResolver();
//making use of a transitional dtd
doc.LoadXml("<!DOCTYPE html SYSTEM \"xhtml1-transitional.dtd\" > " + originalXml);