2016-11-29 13 views
1

Xerces C++ API를 사용하여 XML 파서를 작성했습니다. 간헐적으로 작동하는 노드 값을 가져 오는 방법이 있는데 그 이유를 모르겠습니다.Xerces DOMNode가 노드 이름을 #Text로 반환합니다.

저는 XML에 익숙해서 모든 정보가 정확하지 않으면 용서해주십시오.

예를 들어, 나는 성공적으로 다음과 같이 XML 파일을 구문 분석의 유효성을 검사 할 수 있습니다

<?xml version="1.0" encoding="UTF-8"?> 
<RequestMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../schema/Config.xsd"> 
    <MsgHeader> 
    <MessageID>0</MessageID> 
    <Gic>0000</Gic> 
    <Fcg>1</Fgc> 
    <EventID>0</EventID> 
    </MsgHeader> 
    <PrimaryRate> 
    <Rate>MAX_RATE</Rate> 
    <Value>1</Value> 
    </PrimaryRate> 
    <SecondaryRate> 
    <Rate>MAX_RATE</Rate> 
    <Value>2</Value> 
    </SecondaryRate> 
<Mode>Enable</Mode> 
<Toggle>On</Toggle> 
</RequestMessage> 

하자 예를 들어 내가 "MsgHeader"에서 "FGC"의 값을 찾고 말한다. DOMNode :: getNodeName()을 사용하여 메시지 헤더의 노드 이름을 성공적으로 가져올 수 있으며 DOMNodeList에있는 모든 자식 노드를 가져 와서 루프 할 수 있습니다. 그러나 자식 노드를 반복하면서 DOMNode :: getNodeName()을 사용하여 노드 이름을 인쇄하면 #Text 문자열이 출력됩니다. DOMNode :: getNodeValue() 또는 DOMNode :: getTextContent()를 사용하여 값을 가져 오려고하면 문자열이 비어 있습니다. 예를 들어

는 :

xercesc::DOMNodeList *list = DOMDoc->getElementsByTagName(tagname); 

for(XMLSize_t i=0; i<list->getLength(); i++) { 
    if(list->item(i)->hasChildNode()) { 
     xercesc::DOMNodeList *children = nodeList->item(i)->getChildNodes(); 
     for(XMLSize_t j=0; j<list->getLength(); j++) { 
     xercesc::DOMNode *node = list->item(j); 
     XMLCh *name = node->getNodeName(); 
     XMLCh *value = node->getNodeValue(); 
     XMLCh *text = node->getTextContent(); 
     cout << "Name: " << xercesc::XMLString::Transcode(name) << endl; 
     cout << "Value: " << xercesc::XMLString::Transcode(value) << endl; 
     cout << "Text: " << xercesc::XMLString::Transcode(text) << endl; 
     } 
    } 
} 

OUTPUT: 

Name: #Text 
Value: 
Text: 

모든 통찰력이 크게 감사하겠습니다!

답변

0

기본적으로, xerces는 공백 (탭, 끝선 및 공백)을 textNodes로 간주합니다. 는하지만 (AbstractDOMParser에서 상속) 파서에 다음과 같은 옵션을 설정할 수 있습니다

domParser.setIncludeIgnorableWhitespace(false); 

을 그리고 공백은 구문 분석 중에 무시됩니다.