2016-11-29 4 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); 

と白のスペースは、解析時に無視されます。

関連する問題