标签: msxml

MSXML选择节点不起作用

我正在开发一个自动化测试应用程序,目前我正在编写一个函数来比较两个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>
Run Code Online (Sandbox Code Playgroud)

(注意,可能有多个<subreport>元素,其中包含多个<record>元素.)

我想要的是提取<value>两个文档的标签,然后比较它们的值.那部分我知道怎么做.问题在于提取本身.

由于我遇到了C++,我正在使用MSXML,并编写了一个包装器,允许我的应用程序抽象出实际的XML操作,以防我决定更改我的数据格式.

该包装器CSimpleXMLParser加载XML文档并将其"最高记录"设置为XML文档的document元素.(CRecord是一个抽象类,其CXMLRecord是其子类之一,它可以单独或按组访问子记录,还允许访问Record的"值"(对于子元素或属性的值,在CXMLRecord的情况下) .)CXMLRecord包含一个MSXML :: MSXMLDOMNodePtr和一个指向CSimpleXMLParser实例的指针.)包装器还包含返回子项的实用程序函数,CXMLRecord用它来返回子记录.

在我的代码中,我执行以下操作(尝试返回所有<subreport>节点只是为了查看它是否有效):

CSimpleXMLParser parserReportData;
parserReportData.OpenXMLDocument(strPathToXML);
bool bGetChildrenSuccess = parserReportData.GetFirstRecord()->GetChildRecords(listpChildren, _T("subreport"));
Run Code Online (Sandbox Code Playgroud)

这总是返回false.CXMLRecord :: GetChildRecords()的实现基本上是肉

MSXML2::IXMLDOMNodeListPtr pListChildren …
Run Code Online (Sandbox Code Playgroud)

c++ xpath msxml selectnodes

3
推荐指数
1
解决办法
6074
查看次数

如何从IXMLDOMNode访问元素属性?

我正在用C++构建一个XML DOM文档.我的问题是:我从我的文档中的元素执行XPATH查询,我知道将返回另一个元素.elementPtr-> selectSingleNode调用返回IXMLDOMNode.如何访问此节点的属性?

我的一部分想要将节点转发给一个元素,但我无法让演员工作.

我试过了

MSXML2::IXMLDOMElementPtr pParentElement;
pParentNode->QueryInterface(__uuidof(MSXML2::IXMLDOMElement), 
                            (void**) &pParentElement);
Run Code Online (Sandbox Code Playgroud)

这导致以下运行时错误:

0x0057cc58 _com_error::`scalar deleting destructor'(unsigned int)
Run Code Online (Sandbox Code Playgroud)

我试过的另一条路线就是使用节点:

MSXML2::IXMLDOMNodePtr pParentNode = 
    pParameterElement->selectSingleNode("parent");
MSXML2::IXMLDOMNamedNodeMap* pParentAttributes;
pParentNode->get_attributes(&pParentAttributes);

MSXML2::IXMLDOMNodePtr pCategoryNameNode = 
    pParentAttributes->getNamedItem("Category");
VARIANT value;
pCategoryNameNode->get_nodeValue(&value);
CString categoryName = value;
Run Code Online (Sandbox Code Playgroud)

这在"parentNode-> get_attributes()"处失败.

好像我错过了一些东西; API不应该这么难用.

- 编辑 -

我缺少的是selectSingleNode调用失败,留下了一个NULL指针.你不能在那上面调用QueryInterface,也不能在其上调用get_attributes:P

我选择的答案符合我提出的问题,而不是帮助我意识到我问错了问题的答案.

c++ msxml dom ixmldomelement ixmldomnode

3
推荐指数
1
解决办法
2万
查看次数

使用MSXML 4.0读取UTF-8 XML

我有一个classc ASP/VBScript试图用MSXML读取UTF-8编码的XML文件的问题.文件编码正确,我可以看到所有其他工具.

构造的XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<itshop>
    <Product Name="Backup gewünscht" />
</itshop>
Run Code Online (Sandbox Code Playgroud)

如果我尝试在ASP中这样做...

Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile("input.xml", FOR_READING)
XML = ts.ReadAll
ts.Close
Set ts = nothing
Set fso = Nothing

Set myXML = Server.CreateObject("Msxml2.DOMDocument.4.0")
myXML.loadXML(XML)
Set DocElement = myXML.documentElement
Set ProductNodes = DocElement.selectNodes("//Product")
Response.Write ProductNodes(0).getAttribute("Name")
' ...
Run Code Online (Sandbox Code Playgroud)

...和Name包含特殊字符(特定的德语变音符号)变音符号"双字节代码"的字节被重新编码,所以我最终得到两个完全糟糕的无意义字符.什么应该是"ü"变成"¼" - 在我的输出中是四个字节,而不是两个(正确的UTF-8)或一个(ISO-8859-#).

我究竟做错了什么?为什么MSXML认为输入是ISO-8859-#以便它尝试将其转换为UTF-8?

msxml utf-8 character-encoding asp-classic

3
推荐指数
1
解决办法
5333
查看次数

msxml程序的最后一行出错

我正在使用MSXML 4.0来解析我的xml.

该程序工作正常,但在程序终止之前,我得到以下异常

db2.exe中0x00417be5处的未处理异常:0xC0000005:访问冲突读取位置0x00b1c740.

at comip.hat _Release()method at linem_pInterface->Release();

这是我的代码

#include <iostream>
#include "stdafx.h"
#include "Database.h"
#include <sstream>
#include <objbase.h>
#import <msxml4.dll>

using namespace std;


void main(int argc, _TCHAR* argv[])
{
    ::CoInitialize(NULL);
    MSXML2::IXMLDOMDocumentPtr pXMLDom;
    HRESULT hr= pXMLDom.CreateInstance(__uuidof(MSXML2::DOMDocument40), NULL, CLSCTX_INPROC_SERVER); //Msxml2.DOMDocument.4.0 

    if (FAILED(hr)) 
    {
      printf("Failed to instantiate an XML DOM.\n");
      //return 0;
    }

    try
    {
        pXMLDom->async = VARIANT_FALSE;
        pXMLDom->validateOnParse = VARIANT_FALSE;
        pXMLDom->resolveExternals = VARIANT_FALSE;

        if(pXMLDom->load("users.xml") == VARIANT_TRUE)
        {
            printf("XML DOM loaded from users.xml:\n%s\n", (LPCSTR)pXMLDom->xml);
        }
        else
        {
            // …
Run Code Online (Sandbox Code Playgroud)

c++ com msxml

3
推荐指数
1
解决办法
2983
查看次数

使用MSXML6无法加载带有UTF-8 BOM标记的XML文件

我有一个XML文件,EF BB BF开头有UTF-8 BOM标记().

它还包含encodingas <?xml version="1.0" encoding="UTF-8" ?>.

我正在尝试加载此XML文件IXMLDOMDocument::LoadXML,但无法加载此文档.如果我删除BOM标记,它可以完美地工作.

我的问题是在这种情况下使用BOM标记是错误的还是MSXML的错误(确切地说是MSXML6)?

c++ unicode msxml utf-8

3
推荐指数
1
解决办法
2368
查看次数

如何确定MSXML6是否安装在使用delphi的系统中?

我有一个依赖于MSXML6的应用程序,在部署应用程序的大多数机器上已安装此软件包,但在少数情况下未安装MSXML6,问题是如何检查MSXML 6是否已经安装安装?

xml delphi msxml

3
推荐指数
1
解决办法
2143
查看次数

如何使用vbscript删除XML文件中的节点?

我想从每个节点中删除<P_ID>&节点.<P_Name><product>

这是XML的样子:

<products>
 <product>
     <P_ID><![CDATA[4]]></P_ID>
     <Item_T><![CDATA[Pt]]></Item_T>
     <P_Name><![CDATA[5]]></P_Name>
  </product>
  <product>
     <P_ID><![CDATA[4]]></P_ID>
     <Item_T><![CDATA[Pt]]></Item_T>
     <P_Name><![CDATA[5]]></P_Name>
  </product>
  <product>
     <P_ID><![CDATA[4]]></P_ID>
     <Item_T><![CDATA[Pt]]></Item_T>
     <P_Name><![CDATA[5]]></P_Name>
  </product>
  <product>
     <P_ID><![CDATA[4]]></P_ID>
     <Item_T><![CDATA[Pt]]></Item_T>
     <P_Name><![CDATA[5]]></P_Name>
  </product>
</products>
Run Code Online (Sandbox Code Playgroud)

这些产品节点有数千个.

这是我到目前为止:

Set objXMLDoc = Wscript.CreateObject("Microsoft.XMLDOM") 
objXMLDoc.async = False 

Dim XMLFile
XMLFile = "products.xml"
objXMLDoc.load(XMLFile) 
Set nodes = objXMLDoc.selectNodes("products/product/P_ID")
For Each node In nodes
  objXMLDoc.documentElement.remove
Next

objXMLDoc.Save(XMLFile)
Run Code Online (Sandbox Code Playgroud)

xml vbscript scripting msxml xmldom

3
推荐指数
1
解决办法
7619
查看次数

MSXML2.XMLHTTP 请求验证在 ASP Classic 中输入的 URL

在此先感谢您收到的任何帮助。

我想让我们的客户在文本字段中输入一个 URL,然后检查该 URL 是否存在并有效。

我想检查 3 种可能的结果:状态 200 - 正常,状态 500 - 服务器错误,或状态 404 - 找不到页面。

在 ASP 经典中执行以下代码时,我得到 12007 的状态代码,而我应该得到 404。这是因为它找不到返回 404 代码的网络服务器吗?

Function CheckURL(vURL)
    ON ERROR RESUME NEXT
    Set oXML=Server.CreateObject("MSXML2.XMLHTTP") : oXML.Open "POST",vURL,false : oXML.Send()
    CheckURL = oXML.status
    Set oXML = nothing
End Function
Run Code Online (Sandbox Code Playgroud)

或者这里有什么地方不对劲。除了上述标准之外,我还可能看到哪些状态代码。

msxml http xmlhttprequest asp-classic

2
推荐指数
1
解决办法
6645
查看次数

Windows Server 2016 - MSXML DOMDocument 版本

安装后,Windows Server 2012 和 Windows Server 2016 原生支持哪些版本的 MSXML 和 DOMDocument?

msxml domdocument windows-server

2
推荐指数
1
解决办法
5872
查看次数

MSXML 总是向元素添加命名空间

我想在 VBA 中使用 MSXML 创建 XML。目标输出非常基本:

<Main xmlns="http://www.myurl.com/xml">
    <Info>
        <BaseData>
            <CreationDate>2021-11-10</CreationDate>
            <Hardware>
                <Frquency>100</Frquency>
            </Hardware>
            <SomeCode>000000_0000000</SomeCode>
            <SomeName>HW GPU SoC 1</SomeName>
        </BaseData>
    </Info>
</Main>
Run Code Online (Sandbox Code Playgroud)

但是我的代码在“Info”元素中生成xmlns属性,我不知道为什么:

 <Main xmlns="http://www.myurl.com/xml">
    <Info xmlns="">
        <BaseData>
            <CreationDate>2021-11-10</CreationDate>
            <Hardware>
                <Frquency>100</Frquency>
            </Hardware>
            <SomeCode>000000_0000000</SomeCode>
            <SomeName>HW GPU SoC 1</SomeName>
        </BaseData>
    </Info>
</Main>
Run Code Online (Sandbox Code Playgroud)

这是代码:

Dim doc As New MSXML2.DOMDocument60
Dim root As IXMLDOMNode
   
Dim info As IXMLDOMElement, baseData As IXMLDOMElement
Dim someCode As IXMLDOMElement, someName As IXMLDOMElement, hardware As IXMLDOMElement, freq As IXMLDOMElement, creationDate As IXMLDOMElement
       
Dim namesp As String
  
namesp …
Run Code Online (Sandbox Code Playgroud)

xml vba msxml

2
推荐指数
1
解决办法
393
查看次数