문제

SEPERATE .DTD 파일을 사용자 정의 XML 파일의 DocType로 사용하고 있습니다.

names.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name SYSTEM "names.dtd">
<names>
    <name>
        <text>Pep&eacute;</text>
        <creator>&lost;</creator>
        <history>&lost;</history>
    </name>
    <name>
        <text>Charles</text>
        <creator>James</creator>
        <history>&lost;</history>
    </name>
</names>

names.dtd

<!ELEMENT name (text, creator+, history)>
<!ELEMENT text (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT history (#PCDATA)>

<!-- Placeholder/unknown history or creator name -->
<!ENTITY lost "Lost in the depths of time.">
<!ENTITY eacute "é">

그러나 names.xml에 액세스하려고 할 때 다음과 같은 오류가 발생합니다.

XML 파싱 오류 : 정의되지 않은 엔티티 위치 : http : //localhost/.../names.xml 줄 번호 5, 18 열 :

<text>Pep&eacute;</text>
---------^

명확한 이름 만 사용하기 만하면 xml 및 names.dtd는 동일한 디렉토리에 있으며 사용합니다. http : //localhost/.../names.dtd 작동하지 않습니다.

이것은 그것을 넣을 때 작동하는 것 같습니다 <!ENTITY 내부 a <!DOCTYPE 안에 names.xml 하지만. 누구든지 이것에 대해 조언 할 수 있습니까?

도움이 되었습니까?

해결책

DTD가 올바른지 확인하기 위해 Firefox에서 문서를 열면하지 마십시오. Firefox는 적절한 XML 파서를 통해 XML과 DTD를 통과하지 않습니다. IE에서 XML 문서를 열면 문서가 MSXML 파서를 통해 전달됩니다.

IE에서 XML 문서를 열면 유효하지 않은 문자를 사용하여 DTD에 대한 오류가 발생합니다. 문자 자체가 아닌 EACUTE의 문자 코드를 사용해야합니다. 여기에 내가 일할 코드가 있습니다 ...

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE NAME SYSTEM "names.dtd">
<names>
    <name>
        <text>Pep&eacute;</text>
        <creator>&lost;</creator>
        <history>&lost;</history>
    </name>
    <name>
        <text>Charles</text>
        <creator>James</creator>
        <history>&lost;</history>
   </name>
</names>

그리고

<!ELEMENT name (text, creator+, history)>
<!ELEMENT text (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT history (#PCDATA)>

<!ENTITY lost "Lost in the depths of time.">
<!ENTITY eacute "&#233;">

다른 팁

Firefox 외부 DTD를로드하지 않습니다 (사파리도 아닙니다 보입니다 브라우저가 없습니다). DTD & XML은 외부 DTD를로드하라고 말하면 XMLLINT에서 잘 작동합니다.

$ xmllint --loaddtd names.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE names SYSTEM "names.dtd">
<names>
    <name>
        <text>Pep&eacute;</text>
        <creator>&lost;</creator>
        <history>&lost;</history>
    </name>
    <name>
        <text>Charles</text>
        <creator>James</creator>
        <history>&lost;</history>
    </name>
</names>

편집하다: Hsivonen이 주석에서 지적한 것처럼, 외부 엔티티를 해결하기 위해 DTD를 사용하는 것은 나쁜 생각. 일반적으로 웹에서 DocTypes 또는 DTD를 사용해서는 안됩니다. 문서를 검증하려면 별도의 스키마를 사용해야합니다 (NG를 이완시킵니다 문서 자체에 포함 된 DTD가 아닙니다.

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