XML과 함께 작업하는 동안 선언되지 않은 엔티티 예외에 대한 참조
문제
나는 XMLDOC의 내부 XML을 설정하려고하지만 예외를 얻는다 : 선언되지 않은 엔티티에 대한 참조
XmlDocument xmldoc = new XmlDocument();
string text = "Hello, I am text α – —"
xmldoc.InnerXml = "<p>" + text + "</p>";
이것은 예외를 던진다 :
선언되지 않은 엔티티 '알파'에 대한 언급. 2 행, 위치 2 ..
이 문제를 해결하는 방법은 무엇입니까?
해결책
XML은 HTML과 달리 엔티티 (예 : 유니 코드 문자에 대한 언급)를 정의하지 않으므로 α 등은 해당 문자로 변환되지 않습니다. 대신 숫자 값을 사용해야합니다. <and & in xml 만 사용할 수 있습니다
html을 만들려면 대신 htmldocument를 사용하십시오.
다른 팁
.NET에서는 사용할 수 있습니다 System.Xml.XmlConvert
수업:
string text = XmlConvert.EncodeName("Hello α");
또는 Doctype 선언에 정사각형 괄호 사이에 선언을 두어 엔티티를 로컬로 선언 할 수 있습니다. XML에 다음 헤더를 추가하십시오.
<!DOCTYPE documentElement[
<!ENTITY Alpha "Α">
<!ENTITY ndash "–">
<!ENTITY mdash "—">
]>
엔티티 정의에 대해 "HTML 문자 엔티티"에 대한 Google을 수행하십시오.
교체 및 알파를 사용해보십시오
Α
앞의 대답이 옳습니다. 또 다른 대안은 HTML 문서를 해당 캐릭터 엔티티가 정의되는 DTD에 연결하는 것입니다. 이는 표준 XHTML DTD 정의입니다. XML 파일에는 다음 선언이 포함되어야합니다.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
내부 텍스트를 설정할 수도 있습니다 "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);
String System.net.webutility.htmldecode (string)를 사용하여 모든 HTML 엔티티 인코딩 된 문자를 유니 코드 변형으로 해독합니다. dot.net 프레임 워크 4에서 사용할 수 있습니다
익숙한 HTML 엔티티 이름을 사용하려면 W3C가 귀하를 다루고 "문자에 대한 XML 엔터티 정의"를 제작했습니다. http://www.w3.org/tr/xml-entity-names/, 본질적으로 HTML과 매우 유사한 명명 된 엔티티 목록입니다. 그러나 위에서 언급했듯이 이것은 XML에 내장되어 있지 않으며 이러한 명명 된 엔티티를 사용하려는 XML 애플리케이션에서 명시 적으로 지원해야합니다.