- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个自动化测试应用程序,目前正在编写一个函数来比较两个 XML 文件之间的值,这些文件应该相同,但可能不相同。这是我尝试处理的 XML 示例:
<?xml version="1.0" encoding="utf-8"?>
<report xmlns="http://www.**.com/**">
<subreport name="RBDReport">
<record rowNumber="1">
<field name="Time">
<value>0</value>
</field>
<field name="Reliability">
<value>1.000000</value>
</field>
<field name="Unreliability">
<value>0.000000</value>
</field>
<field name="Availability">
<value> </value>
</field>
<field name="Unavailability">
<value> </value>
</field>
<field name="Failure Rate">
<value>N/A</value>
</field>
<field name="Number of Failures">
<value> </value>
</field>
<field name="Total Downtime">
<value> </value>
</field>
</record>
(注意可能有多个 <subreport>
元素,并且在这些元素中有多个 <record>
元素。)
我想要的是提取 <value>
两个文档的标签,然后比较它们的值。那部分我知道该怎么做。问题在于提取本身。
因为我坚持使用 C++,所以我使用 MSXML,并且编写了一个包装器以允许我的应用程序抽象出实际的 XML 操作,以防我决定更改我的数据格式。
该包装器 CSimpleXMLParser 加载 XML 文档并将其“最高记录”设置为 XML 文档的文档元素。 (CRecord 是一个抽象类,CXMLRecord 是它的子类之一,它允许单独或按组访问子记录,并且还允许访问记录的“值”(子元素或属性的值,在 CXMLRecord 的情况下.) CXMLRecord 包含一个 MSXML::MSXMLDOMNodePtr 和一个指向 CSimpleXMLParser 实例的指针。)包装器还包含用于返回子项的实用函数,CXMLRecord 使用这些函数返回其子记录。
在我的代码中,我执行以下操作(尝试返回所有 <subreport>
节点以查看它是否有效):
CSimpleXMLParser parserReportData;
parserReportData.OpenXMLDocument(strPathToXML);
bool bGetChildrenSuccess = parserReportData.GetFirstRecord()->GetChildRecords(listpChildren, _T("subreport"));
这总是返回错误。 CXMLRecord::GetChildRecords() 的实现主要是
MSXML2::IXMLDOMNodeListPtr pListChildren = m_pParser->SelectNodes(strPath, m_pXMLNode);
if (pListChildren->Getlength() == 0)
{
return false;
}
for (long l = 0; l < pListChildren->Getlength(); ++l)
{
listRecords.push_back(new CXMLRecord(pListChildren->Getitem(l), m_pParser));
}
return true;
CSimpleXMLParser::SelectNodes() 是:
MSXML2::IXMLDOMNodeListPtr CSimpleXMLParser::SelectNodes(LPCTSTR strXPathFilter, MSXML2::IXMLDOMNodePtr pXMLNode)
{
return pXMLNode->selectNodes(_bstr_t(strXPathFilter));
}
运行时,最高记录被设置为<report>
元素正确。我可以用它做各种各样的事情,比如获取它的子节点(通过 MSXML 接口(interface),而不是通过我的包装器)或其名称等。我知道我的包装器可以工作,因为我使用它在应用程序的其他地方用于解析 XML 配置文件,并且可以完美地工作。
我想也许我在 XPath 查询表达式上做错了什么,但我能想到的每一种排列都没有带来任何乐趣。 MSXML::IXMLDOMNodeListPtr
由 IXMLDOMNodePtr::SelectNodes()
返回当我尝试处理此 XML 文件时,它的长度始终为 0。
这让我发疯。
最佳答案
我习惯用 .NET 的 XmlDocument 对象这样做,但我认为这里的效果是一样的:
如果 XML 文档包含命名空间——即使是未命名的——那么 Xpath 查询也必须使用一个。因此,您必须将命名空间添加到 XMLDoument 中,您不妨在代码中为其命名,并在 XPATH 查询中包含前缀(xml 文档和 xml 文档之间的前缀不同并不重要) xpath,只要 namespace 将其整理出来)
所以,当您使用像 /report/subreport/record/field/value
这样的 XPath 时,您实际上需要先设置文档的命名空间:
pXMLDoc->setProperty(_bstr_t("SelectionNamespaces"),
_bstr_t("xmlns:r="http://www.**.com/**"));
然后 selectNodes()
使用 /r:report/r:subreport/r:record/r:field/r:value
关于c++ - MSXML 选择节点不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/284716/
网络服务器正在返回状态代码和描述以响应 XmlHttp 的请求。成分。来自服务器的实际状态响应开头为: HTTP/1.1 400 Not a valid http POST request 我可以在
因此,我正在从事一个项目,根据每个来源的特点,使用许多不同的方法从互联网上的许多不同来源抓取和收集数据。 最近添加的是一个网站 API调用返回以下 XML作为回应: 29b526a69b9
我有一个使用 PHP (libxml) 附带的 XSL 处理器运行的 XSLT 1.0 样式表。我想让相同的样式表在 Microsoft XSL 处理器 MSXML 6.0 (msxml6.dll)
Windows有许多可以并行安装的MSXML版本。即3、4、5和6版。 我必须找到系统上存在哪个msxml文件。我的查询仅通过注册表限制。 最佳答案 您的计算机上安装的所有MSXML版本都将在以下注册
我正在使用 MSXML 6.0 将我自己的 XML 转换为另一种 XML 格式。我不确定我是否只是不明白 MSXML 是如何工作的,但我相信我已经注意到它的一些奇怪行为...... 我正在使用 set
我想在 VBA 中使用 MSXML 创建 XML。目标输出非常基本: 2021-11-10
假设我有一个计算 XPath 表达式“//node/@*”的结果。 MSXML6 返回一组 IXMLDOMNode 对象,它们实际上是 IXMLDOMAttribute 对象。 问题:有没有办法删除仅
XMLNotepad 在转换失败时提供以下文本(例如): Error Transforming XML The variable or parameter 'saturated-background-
我有一个应用程序,用于使用 dll 中的一些遗留代码来测试制造的产品。该应用程序可以针对不同的产品进行设置。设置是通过 xml 文件完成的,并且可以(并且将会)在运行时(即批处理结束时)进行更改。 x
我需要解析一些 XML 并编写一些帮助程序。我不是 C++ 专家,实际上我七年前就用 c 编写过。所以,我想确定一下,我使用的方法是否正确:) 1) 我实现了一些简单的助手来处理异常。例如: CCom
我必须处理一个遗留应用程序,该应用程序使用 MSXML 将测量数据写入一个简单的 XML 文件。基本上,这就是正在发生的事情: MSXML2::IXMLDOMDocument2Ptr pXmlDocu
这似乎是一个常见问题,尽管我在 SO 上找不到它。 我应该在我的应用程序中使用哪个版本的 MSXML,更重要的是,我应该如何决定? 有 MSXML3、4、5 和 6。 我最近在 calling-wcf
我正在开发一个自动化测试应用程序,目前正在编写一个函数来比较两个 XML 文件之间的值,这些文件应该相同,但可能不相同。这是我尝试处理的 XML 示例:
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
使用此代码获取站点的 rss。此代码适用于我的计算机和许多其他计算机。但在某些计算机(Windows XP 或 7)中,我收到此错误:未安装 MSXML 我该如何解决这个问题?怎么了? 代码如下: p
我正在使用 MSXML 4 生成以下 xml 字符串: 但是,我的 IXMLDOMDo
我如何将架构添加到 IXMLDOMDocument ? 例如,我想生成 XML: 我可以构造 DOMDocument60 对象(伪代码): DOMDocument60 doc = new
MSXML6 应该具有最佳的安全性、性能、可靠性和 W3C 一致性 ( Using the right version of MSXML in Internet Explorer )。 问题: 为什么
我使用导入了 MSXML 的 Visual Studio C++ (#import "msxml6.dll") 使用智能指针创建 xml 文档。 我使用 setProperty() 函数创建命名空间,
我有一个 users.xml 我使用以下代码获得了对 Users 元素的引用 IXMLDOMDo
我是一名优秀的程序员,十分优秀!