XML과 함께 작업하는 동안 선언되지 않은 엔티티 예외에 대한 참조

StackOverflow https://stackoverflow.com/questions/281682

  •  07-07-2019
  •  | 
  •  

문제

나는 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 &alpha;");

또는 Doctype 선언에 정사각형 괄호 사이에 선언을 두어 엔티티를 로컬로 선언 할 수 있습니다. XML에 다음 헤더를 추가하십시오.

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

엔티티 정의에 대해 "HTML 문자 엔티티"에 대한 Google을 수행하십시오.

교체 및 알파를 사용해보십시오

  &#913;

앞의 대답이 옳습니다. 또 다른 대안은 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 애플리케이션에서 명시 적으로 지원해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top