2010-08-22 5 views
3

현재이 내가 일하고 샘플 XML을 다음과 같습니다나는 XML에 몇 가지 태그를 구문 분석하고 싶지 않은 것은

<smsq> 
    <sms> 
    <id>96</id> 
    <to>03333560511</to> 
    <msg> danial says: hahaha <space> nothing. 
    </msg> 
    </sms> 
</smsq> 

이제 태그를 해석 할 수 있어야 다른 태그를 (포함 할 수 있습니다,주의하시기 바랍니다) 나는 그것을 위해 국방부를 만들어야 만했다. DTD는이 같은했다 :

<!DOCTYPE smsq [ 
    <!ELEMENT sms (mID,to,msg,type)> 
    <!ELEMENT mID (#PCDATA)> 
    <!ELEMENT to (#PCDATA)> 
    <!ELEMENT msg (CDATA)> 
]> 

을 그러나 문제는 XML 파서가 여전히 태그에 가서 태그는 태그로 폐쇄되어야한다고 말한다는 것이다. XML에서와 마찬가지로 데이터를 가져오고 msg를 더 파싱하고 싶지 않습니다.

이 문제를 해결하고 DTD로이 작업을 수행 할 수 있는지 알려주십시오.

감사합니다.

+0

태그가 닫히지 않으면 XML이 아닙니다. XML을 사용할 수 있으려면 올바른 형식 * 및 * 유효한 * 형식이어야합니다. 모든 XML 파서는 올바른 형식 *이 아닌 경우 입력 XML을 거부하는 데 * 반드시 필요하며 누락 된 닫는 태그는 실제로 잘 형식화되지 않았 음을 의미합니다. 이것은 일반적으로 XML의 폭 넓은 적용 가능성과 유용성의 기초에 놓여 있습니다. – Abel

+0

@Abel, 유효하지 않아도 사용할 수 있습니다. 많은 문맥에서 잘 형성되면 충분합니다. –

+0

@ 존 : 아주 사실이지만, DTD가있는 경우,이 경우 XML은 구문 분석이 유효해야합니다. // Just checked : 유효하지 않은 XML을 * errors *로보고해야하지만, 이러한 오류는 형식이 올바른 경우처럼 치명적인 오류가 아니므로 구문 분석을 계속할 수 있습니다. – Abel

답변

1

먼저 "space"태그가 닫히지 않으므로 샘플 xml은 실제로 xml이 아닙니다.

둘째, "space"태그를 구문 분석하고 싶지 않은 이유는 실제로 xml이 아니기 때문입니다. xml처럼 보이는 텍스트 일뿐입니다. 텍스트는 이스케이프/인코딩되거나 CDATA 태그로 묶어야합니다.

마지막으로 - 구문 분석하려는 내용이 xml이고 첫 번째 수준 태그 만 구문 분석하려는 경우. 나는 진짜 XML 파서로 귀찮게하지 않을 것입니다. - 저 자신의 초소형 파서를 만들 것입니다. 1 단계 노드를 파싱하는 것만으로도 그다지 어렵지는 않습니다.

행운을 빈다.

+0

그래서 노드의 데이터가 CDATA 섹션에있는 한 DTD로 할 수있다 ... –

+0

@Hojou : 아니, CDATA 안에는 파싱되지 않으며 DTD로 정의 될 수 없다. 그러나 DTD를 사용하고 닫히지 않은 (즉, 열린) 요소를 정의하려면 * 할 수 있지만 더 이상 XML이 아닙니다. 그것은 SGML 구현입니다. 고전적인 HTML처럼 작동하기가 훨씬 더 어려워요. – Abel

+0

@Abel : 그것이 제가 말한 것입니다. CDATA에 있다면 파서가 구문 분석하려고하는 것에 대해 걱정할 필요가 없습니다. –

3

DTD는이 문제를 해결할 수 없습니다. DTD는 절대로 필요하지 않습니다 (단, 가지고 있으면 편리합니다).

위에 게시 한 문서가 유효한 XML 문서가 아닙니다. 기간. 그게 그대로이고, 합리적인 XML 파서가 오류를 제기하지 않고 당신을 위해 그것을 구문 분석하지 않습니다.

< 기호를 &lt; XML 엔터티로 대체 할 수 있습니다.

+0

불쾌감은 없지만 간단한 영어로 작성했습니다. "구문 분석하고 싶지 않습니다. XML의 일부 태그 "기간. –

4

버그가있는 XML을 버그가 없도록 만드는 DTD를 만들 수 없습니다. XML은 올바른 형식이 아니므로 올바른 형식이 아닌 타당성이 필수적입니다 (유효성은 AFAICT에서 중요하지 않습니다). 영어 문장의 단어가 모두 영어 단어가되어야 문법적으로 올바른 영어 문장이 될 수있는 것과 유사합니다.

<space>는 종료되지 않습니다. 그것은 <msg> 안에 다음과 같은 </space>을 가지고 있어야하고, <space/>으로 대체해야합니다. 그렇지 않으면 당신이 실제 텍스트 "<space>"을 원하는 것을 의미한다는 것을 의미하는 것으로 말하면, 그런 것으로 인코딩해야합니다 (즉, &lt;space&gt;) .

+0

자바의 인코딩 기능과 PHP의 인코딩 기능을 알려주시겠습니까? –

1

모든 XML 태그는 <tag></tag> 또는 <tag />과 같이 닫아야합니다.

당신은 <space> 태그는 태그의 텍스트 값으로 해석, 그리고 자식 태그로, &lt;&gt; 대신 <>를 사용되도록하려면 :

&lt;space&gt; 
+1

그냥 메모, '>'는 이스케이프해야하지 않습니다 (그렇게하는 것이 일반적입니다). – Abel

0

내가 솔루션을 분리 할 귀하의 문제에 대한 방법과 거래를 간단히 지금합니다.결국 메시지 내용의 정확성을 제어하지 못할 수도 있습니다.

private static String getMessage(String msg){ 
    return msg.substring(msg.indexOf("<msg>")+5, msg.lastIndexOf("</msg>")); 
}//method 

더 많은 사용 사례를 사용할 수있게되면 나중에 향상시킬 수 있습니다.

편집 : 누군가가 콘텐츠에 "msg"요소를 넣은 경우 여전히 작동합니다.

+0

누군가 "msg"요소를 내용에 넣었습니까? 버그가있는 XML을 수정하는 데 필요한 제어 기능이 없다면 ** 버그를 어떻게 처리 할 것인지 ** 정확하게 정의해야합니다. –

+0

XML을 다루는 프로그래머가 문자열을 처리 할 가능성은 거의 없습니다. 그렇게한다면 XML이 아니거나 거대한 실수를 저 지르거나 둘 다 발생합니다. 문자열을 XML로 처리하는 유스 케이스는 극소수에 불과합니다. 예를 들어 XML을 수정 한 다음 XML을 구문 분석 한 다음 요소로 이동 한 다음 해당 요소를 텍스트를 입력 한 다음 필요에 따라 XML로 다시 구문 분석하여 함수를 사용합니다 (Jon은 말합니다). – Abel

+0

Jon Hanna :이 메서드는 첫 번째 ""을 찾고 마지막으로 ""을 찾습니다. 메시지 내용에 "msg"태그를 추가해도이 코드가 손상되지 않습니다. 아벨 (Abel) : "내 작품을 효과를 내기 위해"제안한 변경 사항은 더 이상 효과적이지 않습니다. –

관련 문제