2010-11-20 3 views
2

수천 개의 SGML 문서가 있습니다. 문서의 특정 요소를 가져올 필요가 있지만로드 할 때마다 XDocument, XMLDocument 또는 StreamReader로 읽으려고 할 때마다 다양한 XMLException 오류가 발생합니다.잘 작성되지 않은 SGML/XML 문서의 LOTS 및 LOTS 구문 분석을위한 전략

" '['은 (는) 예기치 않은 토큰입니다. ' 왜? 내가

<!DOCTYPE RChapter PUBLIC "-//LSC//DTD R Chapter for Authoring//EN" [] > 

같은 DOCTYPE이있는 문서를 가지고 있기 때문에 나는이 "[]"안에 유효한 뭔가를해야한다고 배웠습니다. 다시 말하지만, 나는 문서의 생성을 통제하지는 않지만, 나는 그것을 "해독"하고 원하는 데이터를 얻는다. 또 다른 예는 예를 들어, "닫히지 않은 '요소를 가지고있다 :.

이 XMLException은
<Caption>Plants, and facilities<hardhyphen><hyphen>Inspection.</Caption> 

"라인 (27)의'하이픈 '시작 태그'캡션 '선 (27), 위치 (58)의 종료 태그가 일치하지 않습니다. " 당연하지, 그렇지?

그러나 그렇다면 질문은 XMLExceptions가 발생하지 않고 이러한 문서의 특정 요소에 실제로 도달 할 수있는 방법입니다. SAX 파서가 올바른 방법입니까? 나는 기본적으로 문서를 열고, 내가 원하는 요소로 바로 가려고합니다. (근처에 잘 형성되지 않았는지 걱정하지 않고) 데이터를 가져 와서 계속 진행하십시오. 난 그냥 XMLDocument로,하여 XDocument로 구문 분석 잊고, 그냥

str.Replace("<hardhypen><hyphen>", "-") 

같은 간단한 문자열 교체를 수행 한 후 XML 파서 중 하나에로드하려고합니다. 전략에 대한 조언?

+0

어떤 언어를 사용하고 있습니까? –

+0

잘 형성되지 않았다면 C# 또는 VB.NET – Robert4Real

+0

을 사용할 수 있습니다. XML이 아니고 문제가 있습니다. SGML을 XML로 먼저 변환하고 싶습니다. https://github.com/MindTouch/SGMLReader, http://mmalachowski.blogspot.com/2013/08/performance-test-of-c-html-xpath.html – Jodrell

답변

3

문제는 XML 도구로 SGML을 구문 분석하려고한다는 것입니다. 그들은 동일하지 않습니다. XML 도구/언어를 사용하여 데이터에 액세스하려면 SGML을 구문 분석하기 전에 SGML을 XML로 변환해야 할 수 있습니다.

SGML (OmniMark와 같은)을 지원하는 언어/도구 또는 "XML 유사"데이터 (예 : 첫 번째 대답의 nokogiri)를 처리 할 수있는 도구를 사용하는 것이 가장 이상적입니다.

이것은 매우 간단 할 수 있지만 일부 지점에서는 까다로울 수 있습니다. 특히 여러 개의 DTD (doctypes)에 대해 이야기하고 있다면. SGML과 XML의 차이점은 다음과 같습니다. (SGML과 XML의 차이점은 다음과 같습니다.) SGML과 XML의 차이점은 다음과 같습니다. 당신이 처리해야 할 것입니다. (당신은이 길을 가고 싶지 않을 수도 있지만 어쨌든 정보를 제공하는 데 도움이 될 수 있습니다.) : 귀하의 예제에서

  1. DOCTYPE 선언

    DOCTYPE 선언은 완벽하게 유효한 SGML의 문서 타입이다. [] (내부 하위 집합)에는 아무 것도 필요 없습니다. 내부 하위 집합 (일반적으로 엔티티 선언)에 선언이있는 경우 XML에 doctype 선언을 유지해야 할 가능성이 높습니다.

    XML 파서가 갖고있는 문제는 선언에 시스템 식별자가 없다는 것입니다. XML Doctype 선언에서 공용 식별자가있는 경우 시스템 식별자가 필요합니다. SGML doctype 선언에서, 필수는 아니다.

    결론 : XML이 DTD/스키마로 구문 분석되거나 내부 하위 집합에 선언이 필요한 경우가 아니면 doctype 선언을 제거합니다. XML이 유효해야 할 경우 적어도 시스템 식별자를 추가해야합니다. <?xml ...?> 처리 명령을 추가하는 것을 잊지 마십시오. 끝 태그

    <hardhyphen><hyphen> 요소가없는

  2. 요소가 유효 SGML 있습니다. SGML DTD를 사용하면 태그 최소화를 지정할 수 있습니다. 이것이 의미하는 바는 종료 태그가 필요한지 여부를 지정할 수 있다는 것입니다. (당신은 또한 시작 태그는 선택 할 수 있습니다,하지만 그건 미친 이야기입니다.) XML에서 당신이

    할 수있는 가장 좋은 것은 당신의 SGML DTD 보는 것입니다 (<hardhyphen/> 또는 <hardhyphen></hardhyphen> 같은) 이러한 요소를 닫고보고 무슨 요소 선택적 끝 태그가 있습니다. 태그 최소화는 요소 선언의 요소 이름 바로 다음에 지정됩니다. '-'는 태그가 필요함을 의미합니다. 'o'(문자 '오')는 태그가 선택 사항임을 의미합니다. 예를 들어 <!ELEMENT hyphen - o (#PCDATA)>이 표시되면 시작 태그가 필요하고 (-) 끝 태그가 선택 사항임을 나타냅니다 (o). <!ELEMENT hyphen - - (#PCDATA)>이 표시되면 시작 및 종료 태그가 모두 필요합니다.

    결론 : 제대로 그들이 같이 닫을 때 종료 태그를 두 번째 ?이없는 SGML에서

  3. 처리 지침

    처리 지침 (PI의)가 없습니다 모든 요소를 ​​닫습니다 XML이합니다. 두 번째 ?을 추가해야합니다.

    예 SGML PI : <?asdf jkl>

    예 XML의 PI : <?asdf jkl?>

  4. 흠도/제외

    당신은 아마 이것에 대해 걱정할 필요가 없습니다,하지만, SGML DTD에서 당신이 지정할 수 있습니다 다른 요소가 그 요소 안의 어느 곳에서든지 허용되거나 허용되지 않는 요소 선언. 목표 XML이 DTD를 구문 분석해야하는 경우 이는 매우 어려울 수 있습니다. XML DTD는 포함/제외를 허용하지 않습니다.

    <!ELEMENT chapter - - (section)+ +(revst|revend)>

    이것은 revst 또는 revend 어디 chapter의 내부에 허가되는 것을 말하고있다 :

    이것은 포함를 보여주고 있습니다. 요소 선언에 -(revst|revend)이 있으면 chapter의 어느 곳에서든지 revst 또는 revend이 아니고이 허용되지 않음을 의미합니다.

희망이 있습니다.

1

그래, Nokogiri을 사용하십시오.

해당 페이지에서 조금 아래로 스크롤하고 "시놉시스"아래의 코드를 파일로 복사하십시오 (예 : xml-parser.rb). 그런 다음 Mac에서 (Ruby는 Mac에 이미 설치되어 있습니다.) 터미널에서 실행하면 gem install nokogiri을 실행 한 다음 ruby xml-parser.rb과 함께 파일을 실행하십시오.

터미널에서 바로 irb을 입력 한 다음 require 'nokogiri'을 입력하고 실시간으로 nokogiri API로 재생을 시작할 수 있습니다. 쌍방향 루비가 좋아야 해. :)

Windows 사용자 인 경우 Ruby installer for Windows을 사용해보세요.

관련 문제