C++ 中的 Xpath 查询
Xpath Query in c++
我需要C++中的 xpath 查询才能直接从节点<revisions>
获取idNumber
。我尝试了以下内容,它总是返回null
.请让我知道我做错了什么。
XML 文件:
<?xml version="1.0" encoding="UTF-8" ?>
<cw:vessel version="1.07.0075" creationDate="2016-01-26" xmlns:cw="urn:container">
<!-- saved from url=(0024)http://www.systemsoftsol.com/ -->
<Exchanger>
<revisions>
<revision>
<idNumber>1401889476</idNumber>
<revNumber>0</revNumber>
<revDate>2014-06-04</revDate>
<operator>devin</operator>
<notes>read me</notes>
</revision>
</revisions>
</Exchanger>
</cw:vessel>
到目前为止我的代码:
void GetProperties()
{
HRESULT hr = NOERROR;
CComPtr<::IXMLDOMDocument3> m_pxmlDomDocument = NULL;
CComPtr<::IXMLDOMNode> pNode = NULL;
IXMLDOMNodeList* pChildlist = NULL;
VARIANT_BOOL vLoadBool = VARIANT_FALSE;
hr = m_pxmlDomDocument.CoCreateInstance(__uuidof(DOMDocument60));
hr = m_pxmlDomDocument->setProperty(BSTR(L"SelectionLanguage"), (CComVariant)L"XPath");
hr = m_pxmlDomDocument->setProperty((CComBSTR)"MaxElementDepth", (CComVariant)INT_MAX);
if (FAILED(hr))
{
hr = ERROR_XML_PARSE_ERROR;
}
CComVariant varXmlFileName(_T("xmlfileinput"));
m_pxmlDomDocument->load(varXmlFileName, &vLoadBool);
hr = m_pxmlDomDocument->get_documentElement(&pDocRoot);
hr = pDocRoot->selectSingleNode(_T("//Exchanger"), &pNode);
pNode->get_childNodes(&pChildlist);
long size;
hr = pChildlist->get_length(&size);
for (int i = 0; i < size; i++)
{
CComPtr<::IXMLDOMNode> referNode;
hr = pChildlist->get_item(i, &referNode);
if (referNode != NULL)
{
CString csXPathQuery;
csXPathQuery.Append(_T("/idNumber"));// i need this from above xml
CComBSTR csBstrQuery(csXPathQuery);
CComPtr<::IXMLDOMNode> pPa;
hr = referNode->selectSingleNode(csBstrQuery.m_str, &pPa);
}
}
}
selectSingleNode()
在上面的代码段中返回null
,即使我在 xml 文件中仍然有idNumber
。
我认为错误出在此代码中:
hr = pDocRoot->selectSingleNode(_T("//Exchanger"),&pNode);
idNumber 不是 Exchanger
的孩子,而是revision
的孩子:
hr = pDocRoot->selectSingleNode(_T("//Exchanger/revisions/revision"),&pNode);
顺便说一句,你真的需要循环revision
的所有孩子吗?为什么你不能像这样直接问idNumber
:
hr = pDocRoot->selectSingleNode(_T("//Exchanger/revisions/revision/idNumber"),&pNode);
if (pNode != NULL)
{
// do something
}
我想出了我的自我,这是修复。
1) 在 selectSingleNode 中,我们应该将 idNumber 作为 "//idNumber" 而不是 "/idNumber" 传递。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 查询SQLite数据库中的日期
- 如何在ArangoDb AQL查询中指定数据库
- Qt SQLite没有查询或参数计数不匹配
- 如何使用c++在VS 2019上运行SQL查询
- 从返回的顶点缓冲区查询顶点结构
- 以非特权用户身份查询 NTFS 特殊文件的元数据?
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 查询 NFS 上的提升进程间::file_lock
- Qt JSON – 从子项查询
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 无法从 Win10 中的 IDirectDraw7 查询 IDirect3D7
- 无法使用 <script> XPath 表达式通过 libxml++ 获取 XHTML 内容
- 如何查询以确定我的 MacOS/X 应用程序是否处于应用程序午睡模式?
- 在子数组中查找多个查询的不同(唯一)值的数量
- DNS 查询格式标头结构中的小字节序问题
- QSql查询行受影响的结果
- 具有多个 OR 的 Xpath 查询不适用于 Windows 事件
- 无法使用 libxml2 处理 xpath 查询
- C++ 中的 Xpath 查询