2012-04-30 1 views
1

저는 C++과 Xerces-c를 사용하여 XML 파서를 작성해 왔지만, 알아낼 수없는 문제가 발생했습니다. 내가 노력하고 내가이C++ Xerces-c - 노드가 자리 표시 자인지 확인하는 방법

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<Config> 
<Person> 
    <Title>Mr.</Title> 
    <Forename>Stephen</Forename> 
    <Surname>Cassidy</Surname> 
    <Job> 
     <Title>Position1</Title> 
     <Position>Worker</Position> 
     <Salary>£6.40</Salary> 
    </Job> 
    <Job> 
     <Title>NewJob</Title> 
     <Position>PositionWorker1</Position> 
     <Position>AnotherPosition</Position> 
     <Salary>£12,000</Salary> 
    </Job> 
</Person> 

같은 XML 파일이)

를 문제, 나는 주위에 일을 얻을 수 있지만 :) 주위 내 방식 "해킹"싶지 않아 해야 할 일은 노드가 다른 자식 노드의 "자리 표시 자"일 뿐인지를 알아내는 것입니다. <Person> 노드 또는 <Job> 노드처럼 처리하고 시도하지 말고 자식 노드를 확인하십시오.

이유는 노드 이름 (예 : Title)과 값 (예 : NewJob)뿐만 아니라 하위 항목 목록을 저장하는 클래스 내에 노드 값을 저장하므로 Job은 노드 항목이됩니다 , Title, Position 및 Salary는 모두 Job의 "하위"항목이됩니다. 그러나 나는 Job이 이미 Position에 대한 엔트리를 가지고 있는지 확인하고, 새로운 엔트리를 만들고 그것도 Job을 추가하는 대신에, 이미 존재하는 Position 엔트리에 Position의 값을 추가하기를 원한다. 누구에게나 감각 :

도움이 될만한 사람은 없을 것입니다. 코드 작성자 나 다른 사람에게도 몇 가지 힌트 나 포인터가 필요합니다. :)!

+0

왜 자신의 클래스에 노드를 저장합니까? Xerces는이를위한 구조를 제공합니다. 일반적으로 각 하위 항목의 이름을 확인하고 '위치'인 경우 노드를 반환하는 방법에 대해 생각해 보겠습니다. – lupz

답변

0

이 경우 SAX 파서를 사용하는 것이 좋습니다. 자신 만의 객체를 만들면 DOM을 만들 필요가 없으며 SAX를 실행하는 동안 자신 만의 객체를 쉽게 채울 수 있습니다. 이렇게하면 메모리 소비가 줄어들며 대용량 파일을 처리 할 때 훨씬 빨라질 수 있습니다.

기본적으로, SAX 파서를 사용하여

SAX2XMLReaderImpl* sax_parser = new SAX2XMLReaderImpl(); 
MyDefaultHandler* docHandler = new MyDefaultHandler(); // derived from DefaultHandler 

sax_parser->setContentHandler(docHandler); 
sax_parser->parse(pszPath); 

의 순서 인 SAX 인터페이스의 자세한 설명서는 여기에서 찾을 수 있습니다 : SAX2XMLReader

당신은 당신의 MyDefaultHandler에 구현 된 콜백을 통해 호출됩니다 Xerces가 XML을 파싱하는 동안. 필요에 따라 개체를 채 웁니다.

희망이 도움이됩니다.

+0

DOM 파서를 사용하여 수행 할 수 있습니다. 파서는 전형적으로 서로 다른 유형의 노드에 플래그를 붙입니다 (텍스트 노드/일반 문자 데이터 노드 인 경우). – dirkgently

+0

물론 DOM 파서가이를 수행하고 있습니다. 그러나 왜 자신의 데이터 구조도 생성되면 DOM 트리를 만들어야합니다. 더 많은 정보가 없으면 주어진 사실대로 원래의 질문에서이 사실을 취합니다. 따라서 DOM 트리도 생성하지 않는 것이 좋습니다. – Clemens

+0

OP 질문에 대한 제 독서가 다른 방향이었습니다. 저는 DOM 파서를 사용하고 있다고 생각했습니다. – dirkgently

0

JobELEMENT_NODE이어야하며 다른 하나는 TEXT_NODE이어야합니다. getNodeType() 구성원을 사용하여 유형을 확인한 다음 필요에 따라 계속 진행할 수 있습니다.

+0

흠 나는 그것을 시도했지만 어떤 이유로 이 ELEMENT_NODE로오고 있었는데 그 다음에 공백 문자가 TEXT_NODE로 표시 되었기 때문에 내 코드에서 노드가 있습니다. S 큰 문제는 아닙니다. 해킹을 사용하지 말고 올바르게 해결할 수 있습니다. P – KingTravisG

+0

@ SCassidy1986 : 이것은 파서가 다음과 같은 이유 때문입니다. 공백 처리를 유지합니다. 이 동작은 꺼질 수 있습니다. 'DocumentHandler :: ignorableWhitespace()'를 사용해 볼 수 있습니까? – dirkgently

+0

나는 여전히 SAX 파서를 사용하는 것이이 작업이 더 쉬울 것이라고 믿는다 ;-) – Clemens

관련 문제