簡體   English   中英

Xerces XPath在路徑不存在時導致段錯誤

[英]Xerces XPath causes seg fault when path doesn't exist

我可以成功使用Xerces XPath功能通過以下XML和C ++代碼從XML查詢信息。

XML格式

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <ApplicationSettings>
        hello universe
    </ApplicationSettings>
</root>

C ++

int main()
{
  XMLPlatformUtils::Initialize();
  // create the DOM parser
  XercesDOMParser *parser = new XercesDOMParser;
  parser->setValidationScheme(XercesDOMParser::Val_Never);
  parser->parse("fake_cmf.xml");
  // get the DOM representation
  DOMDocument *doc = parser->getDocument();
  // get the root element
  DOMElement* root = doc->getDocumentElement();

  // evaluate the xpath
  DOMXPathResult* result=doc->evaluate(
      XMLString::transcode("/root/ApplicationSettings"), // <-- HERE IS THE XPATH
      root,
      NULL,
      DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE, //DOMXPathResult::ANY_UNORDERED_NODE_TYPE, //DOMXPathResult::STRING_TYPE,
      NULL);

  // look into the xpart evaluate result
  result->snapshotItem(0);
  std::cout<<TranscodeToStr(result->getNodeValue()->getFirstChild()->getNodeValue(),"ascii").str()<<std::endl;;

  XMLPlatformUtils::Terminate();
 return 0;
}

問題在於有時我的XML僅具有某些字段。 但是,如果我從XML中刪除ApplicationSettings條目,則會出現段錯誤。 如何正確處理這些可選字段? 我知道嘗試從段錯誤中糾正是有風險的業務。

段故障發生在這條線

 std::cout<<TranscodeToStr(result->getNodeValue()->getFirstChild()->getNodeValue(),"ascii").str()<<std::endl;

特別是在get getFirstChild()調用中,因為getNodeValue()的結果為NULL

這是我的快速而骯臟的解決方案。 這不是很理想,但是可以。 我希望進行更復雜的評估和響應。

if (result->getNodeValue() == NULL)
{
  cout << "There is no result for the provided XPath " << endl;
}
else
{
  cout<<TranscodeToStr(result->getNodeValue()->getFirstChild()->getNodeValue(),"ascii").str()<<endl;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM