2010-03-10 2 views
1

큰 XML 파일을 구문 분석하고 구문 오류를 수정하기위한 간단한 C++ 셸 프로그램을 작성했습니다.XML 구문 분석 : 문자열 C++ 내의 문자열 확인

나는 예를 들어, 문자열 내에서 문자열을 제외하고 생각할 수있는 모든 것을 다뤘다.

<ROOT> 
    <NODE attribute="This is a "string within" a string" /> 
<ROOT> 

내 프로그램은 문자로 전체 XML 파일 문자를 통해 루프 (효율성을 위해 한 번에 메모리에 몇 문자를 유지), 그것은 등등 & <>과 같은 일을 찾고 &amp; &gt; &lt; 등으로 그들을 탈출 내가 뭘하는지에 대한 기본 예제는 이것에 대한 대답을 받아 들일 수있다. Escaping characters in large XML files

질문은 다음과 같다. 인용 부호를 벗어나는 "문자열"을 탐지하기 위해 사용할 수있는 조건이나 논리는 무엇 일 수 있는가 :

<ROOT> 
    <NODE attribute="This is a &quot;string within&quot; a string" /> 
<ROOT> 

전혀 가능합니까?

답변

1

속성이 끝나는 부분과 끝나는 부분을 결정하는 것이 어렵다고 생각합니다. 당신은 이것으로 당신은 당신이 모호한 경우가있을 것이다, 그렇지 않으면 구문 분석 할 수있는 가능한 입력을 제한 할 필요가 있다고 생각 :

<ROOT> 
    <NODE attribute="This is a "string within" a string" attribute2="This is another "string within" a string" /> 
<ROOT> 

이 중 하나를 두 속성 또는 하나 개의 속성입니다.

동일한 수의 큰 따옴표와 등호 뒤에 새로운 속성이 시작된다는 가정이 있습니다. 그런 다음 모든 내부 큰 따옴표를 이스케이프 문자열로 바꾸기 만하면됩니다. 또는 2 등가 이상의 큰 등호는 새로운 속성을 의미합니다. 노드의 끝 부분도 마찬가지입니다.

4

더 나은 해결책은 오류가 생성되기 전에 이러한 종류의 오류를 수정하는 것입니다. XML은 이런 종류의 추측을하지 않아도되도록 엄격하게 설계되었습니다. XML이 유효하지 않은 경우 수행해야하는 유일한 작업은이를 거부하고 유용한 오류 메시지를 출력하는 것입니다. 의

이 보정 말을 :

<NODE attribute="This is a &quot;string within&quot; a string" /> 

영어를 이해하는 혜택과 함께, 분명보다 나은

<NODE attribute="This is a " string-within=" a string" /> 

, 우리는 이전의 꽤 확신 할 수 있지만, 때를 수 자동화 된 접근 방식을 취한다면 더 심각한 오류를 숨기지 않을 것이라는 확신이 들지 않습니다.

이스케이프 문제를 해결할 장소는 xml 파일을 만드는 경우입니다.

+0

문제는 XML 생성 방법에 대한 권한이 없다는 것이므로 나에게 이런 식으로 주어졌으며 직접 수정해야합니다. 큰 문제는 아니지만 할 수있는 한 최대한 자동화하고 싶습니다. –