web-dev-qa-db-ja.com

XMLでの作業中の宣言されていないエンティティ例外への参照

Xmldocのinnerxmlを設定しようとしていますが、例外が発生します:宣言されていないエンティティへの参照

XmlDocument xmldoc = new XmlDocument();
string text = "Hello, I am text α   – —"
xmldoc.InnerXml = "<p>" + text + "</p>";

これは例外をスローします:

宣言されていないエンティティ「alpha」への参照。行2、位置2。

この問題をどのように解決しますか?

23
Rob

.Netでは、System.Xml.XmlConvertクラスを使用できます。

string text = XmlConvert.EncodeName("Hello &alpha;");

または、DOCTYPE宣言の角かっこで囲んで宣言を配置することにより、エンティティをローカルで宣言することもできます。次のヘッダーをxmlに追加します。

<!DOCTYPE documentElement[
<!ENTITY Alpha "&#913;">
<!ENTITY ndash "&#8211;">
<!ENTITY mdash "&#8212;">
]>

エンティティ定義については、「html文字エンティティ」でグーグルを実行してください。

13
LandedGently

&Alphaを次のように置き換えてみてください

  &#913;
6
FlySwat

前の答えは正しいです。もう1つの方法は、htmlドキュメントをそれらの文字エンティティが定義されているDTDにリンクすることです。これは、標準のXHTMLDTD定義です。 xmlファイルには次の宣言が含まれている必要があります。

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
            "http://www.w3.org/TR/html4/strict.dtd">
6

文字列System.Net.WebUtility.HtmlDecode(string)を使用します。これにより、HTMLエンティティでエンコードされたすべての文字がUnicodeバリアントにデコードされます。 dot.netフレームワーク4から入手できます。

0
verbedr

慣れ親しんだHTMLエンティティ名を使用したい場合は、W3Cが対応し、「文字のXMLエンティティ定義」を作成しました http://www.w3.org/TR/xml-entity -names / 。これは基本的に、HTMLにあるものと非常によく似た名前付きエンティティのリストです。ただし、前述のように、これはXMLに組み込まれていないため、これらの名前付きエンティティを使用するXMLアプリケーションで明示的にサポートする必要があります。

0
dret

InnerTextを"Hello, I am text α – —"に設定して、XmlDocumentがそれらを自動的にエスケープするようにすることもできます。おもう。

0
configurator

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);
0
Nick Josevski