유효한 XML 파일에 XML 선언이 필요합니까?


122

Xerces의 Sax Parser를 사용하여 XML 파일을 구문 분석하고 있습니다.
XML 선언이 <?xml version="1.0" encoding="UTF-8"?>필요합니까?


3
유효한 문서와 올바른 형식의 문서에는 차이가 있습니다. 그 중 무엇을 의미합니까?
Felix Kling 2011-08-10

프롤로그 오류 / 잘못된 utf-8 인코딩을 받고 있습니다. 그런 다음 사용자가 메모장을 사용하여 파일을 여는 XML 파일에서 BOM을 찾았습니다 (나는 이것을 피할 수 없습니다). 유효하거나 잘 구성된 문서를 언급하고 있는지 확실하지 않습니다. "<"앞의 모든 바이트를 제거하는 함수를 만드는 이유 때문에 오류를 피하면됩니다. xml 헤더 선언이 필요한지 확인해야합니다. 여러분 어떻게 생각하세요?
eros

BOM을 제거하는 Java 클래스가 있습니까? 또는 xml 파일에서 몇 바이트? InputStream에서. FilterInputStream & PushbackInputStream의 skip 메서드를 생각하고 있지만 사용 방법에 대해서는 모르겠습니다.
eros

@eros : " 유효하거나 잘 구성된 문서를 참조하고 있는지 잘 모르겠습니다 ." 차이에 대한 간결한 설명은 잘 구성된 XML과 유효한 XML 을 참조하십시오 .
kjhughes

답변:


184

XML 1.0에서 XML 선언선택 사항 입니다. XML 1.0 권장 사항의 섹션 2.8을 참조하십시오 . 여기서 "사용해야합니다"라고 표시되어 있습니다. 이는 권장되지만 필수는 아님을 의미합니다. 그러나 XML 1.1에서는 선언이 필수 입니다. XML 1.1 권장 사항의 섹션 2.8을 참조하십시오 . 여기서 "MUST"를 사용해야합니다. 것을 심지어 상태에가는 경우 선언이 존재하지 않는, 즉 자동으로 문서가 XML 1.0 문서입니다 의미한다.

에 있습니다 선언 XMLencodingstandalone모두 선택 사항입니다. 만은 version필수입니다. 또한 속성이 아니므로 존재하는 경우 순서대로 있어야합니다 : version, any encoding, any standalone.

<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" standalone="yes"?>
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>

이러한 방식으로 인코딩을 지정하지 않으면 XML 파서가 사용되는 인코딩을 추측합니다. XML 1.0 권장 사항은 문자 인코딩을 자동으로 감지 할 수있는 한 가지 방법을 설명합니다 . 실제로 입력이 UTF-8, UTF-16 또는 US-ASCII로 인코딩 된 경우 이는 큰 문제가 아닙니다. US-ASCII 범위 (예 : ISO 8859-1)를 벗어난 문자를 사용하는 8 비트 인코딩이 발견되면 자동 감지가 작동하지 않습니다. 가능하면 생성하지 마십시오.

standaloneXML 문서가 올바르게 DTD없이 여부를 처리 할 수 있는지 여부를 나타냅니다. 사람들은 거의 사용하지 않습니다. 요즘에는 DTD없이 정보가 누락 된 XML 형식을 디자인하는 것은 좋지 않습니다.

최신 정보:

"프롤로그 오류 / 잘못된 utf-8 인코딩"오류는 파서가 파일 내에서 찾은 실제 데이터가 XML 선언에 명시된 인코딩과 일치하지 않음을 나타냅니다. 또는 파일 내부의 데이터가 자동 감지 된 인코딩과 일치하지 않는 경우도 있습니다.

파일에 BOM (byte-order-mark)이 포함되어 있으므로 UTF-16 인코딩이어야합니다. 나는 당신의 선언 <?xml version="1.0" encoding="UTF-8"?>이 파일이 메모장에 의해 UTF-16으로 변경되었을 때 분명히 잘못된 것이라고 생각한다고 생각합니다 . 간단한 해결책은를 제거 encoding하고 간단히 <?xml version="1.0"?>. 편집 할 수도 encoding="UTF-16"있지만 원래 파일 (UTF-16이 아님) 또는 파일이 어떻게 든 UTF-8 또는 다른 인코딩으로 다시 변경되면 잘못된 것입니다.

BOM을 제거하려고 시도하지 마십시오. 이것이 문제의 원인이 아닙니다. 메모장이나 워드 패드를 사용하여 XML을 편집하는 것이 진짜 문제입니다!


내 질문에 대한 답변은 받았지만 팔로우 질문은 그렇지 않았습니다. 다른 질문을 만들어야합니까? 또는 여기에 추가하십시오.
eros

5
BOM이 문제의 원인이 될 수 있습니다. 일부 이전 XML 파서는 UTF-8 문서의 시작 부분에서 BOM을 허용하지 않습니다 (UTF-16 용으로 설계되었으며 나중에 UTF-8에서만 허용됨). 그러나 최신 버전의 Xerces를 사용하는 경우 문제가되지 않을 것입니다.
Michael Kay

또한 메모장의 "다른 이름으로 저장"대화 상자에서 XML을 저장할 인코딩을 선택할 수 있습니다. BOM을 제거하려면 "ASCII"로 저장하십시오 (유니 코드 문자를 사용하지 않는다고 가정). 하위 127 자의 경우 ASCII와 UTF-8이 동일합니다.
BrainSlugs83

8

XML 선언은 선택 사항이므로 XML이 없으면 XML이 잘 구성됩니다. 그러나 특히 사용 된 인코딩에 대해 파서가 잘못된 가정을하지 않도록 사용하는 것이 좋습니다.


3
XML 파서가 이미 문서 디코딩을 시작한 후 사용할 인코딩을 알려주는 것이 이상하다고 생각하는 사람은 나뿐입니까? 내 말은, 그것이 그 태그를 파싱하고 그것이 말하는 것을 이해할 수 있다면 그것은 이미 올바른 인코딩을 알아 낸 것입니다. 인코딩 속성에 대한 합법적 인 사용을 생각할 수 없습니다.
BrainSlugs83

2
@ BrainSlugs83 BOM이없는 경우 인코딩은 8 비트로 지정됩니다. 따라서 ASCII 또는 UTF-8 또는 이전 8 비트 국가 인코딩 중 하나입니다. XML 선언은 모두 하반부 8 비트로, 모든 인코딩간에 동일하며 상반부를 선택할 수있는 충분한 정보를 전달합니다. 최고의 디자인은 아니지만 예를 들어 CP1241과 CP866을 추측하는 것보다 훨씬 낫습니다. 예전에는 텍스트 파일에서 흔히 볼 수있었습니다.
Eugene Ryabtsev 2015 년

그러나 그들은 깔끔하게되었고 XML이 UTF-8이라고 말 했어야했다.
Lothar

3

version및에 대한 기본값을 사용하지 않는 경우에만 필요합니다 encoding(이 예에 있음).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.