标签: msxml6

解析MSXML时引用未声明的命名空间前缀

我该如何解决

Reference to undeclared namespace prefix: '%s'
Run Code Online (Sandbox Code Playgroud)

微软的msxml实现问题?


我正在使用来自政府网站的XML Feed,其中包含我需要解析的值.xml包含名称空间:

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="http://purl.org/rss/1.0/"
    xmlns:cb="http://www.cbwiki.net/wiki/index.php/Specification_1.1"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:dcterms="http://purl.org/dc/terms/"
    xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.w3c.org/1999/02/22-rdf-syntax-ns#rdf.xsd">
    <item rdf:about="http://www.bankofcanada.ca/stats/rates_rss/STATIC_IEXE0101.xml">
        <cb:statistics>
            <cb:exchangeRate>
                <cb:value decimals="4">1.0351</cb:value>
                <cb:baseCurrency>CAD</cb:baseCurrency>
                <cb:targetCurrency>USD</cb:targetCurrency>
                <cb:rateType>Bank of Canada noon rate</cb:rateType>
                <cb:observationPeriod frequency="daily">2011-05-09T12:15:00-04:00</cb:observationPeriod>
            </cb:exchangeRate>
        </cb:statistics>
    </item>
</rdf:RDF>
Run Code Online (Sandbox Code Playgroud)

运行XPath查询:

/rdf:RDF/item/cb:statistics/cb:exchangeRate/cb:targetCurrency
Run Code Online (Sandbox Code Playgroud)

失败并出现错误:

Reference to undeclared namespace prefix: 'rdf'
Run Code Online (Sandbox Code Playgroud)

编辑:

如果我编辑原始XML以删除所有命名空间的使用:

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf>
    <item>
        <statistics>
            <exchangeRate>
                <value decimals="4">1.0351</value>
                <baseCurrency>CAD</baseCurrency>
                <targetCurrency>USD</targetCurrency>
                <rateType>Bank of Canada noon rate</rateType>
                <observationPeriod frequency="daily">2011-05-09T12:15:00-04:00</observationPeriod>
            </exchangeRate>
        </statistics>
    </item>
</rdf>
Run Code Online (Sandbox Code Playgroud)

查询/rdf/item/statistics/exchangeRate/baseCurrency不会失败,并返回节点:

<baseCurrency>CAD</baseCurrency>
Run Code Online (Sandbox Code Playgroud)

如何让Microsoft XML与名称空间一起使用? …

msxml xml-namespaces msxml6

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

如何使用MSXML查询默认命名空间

我有一些XML:

<?xml version="1.0" ?>
<Project ToolsVersion="4.0">
    <PropertyGroup Condition="'$(key)'=='1111'">
          <Key>Value</Key>
    </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

注意:这不是我正在使用的实际XML,它只是更漂亮和更短,并演示了这个问题.

使用MSXML我可以查询节点:

IXMLDOMNode node = doc.selectSingleNode("//PropertyGroup/@Condition");
Run Code Online (Sandbox Code Playgroud)

它工作正常:

条件= " '$(密钥)' == '1111'"

但这并不是我所拥有的XML

实际上,我的XML包含一个名称空间声明:

的xmlns = "http://schemas.microsoft.com/developer/msbuild/2003"

制作实际的 XML文档:

<?xml version="1.0" ?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup Condition="'$(key)'=='1111'">
          <Key>Value</Key>
    </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

现在我的查询:

IDOMNode node = doc.selectSingleNode("//PropertyGroup/@Condition");
Run Code Online (Sandbox Code Playgroud)

不返回匹配的节点.

如何使用MSXML查询默认命名空间?

注意:

如何使用MSXML 查询"默认""未命名"命名空间?


注意:实际上我正在使用SQL Server的XML ShowPlan输出:

<?xml version="1.0" …
Run Code Online (Sandbox Code Playgroud)

msxml xml-namespaces msxml6

13
推荐指数
1
解决办法
7250
查看次数

如何使用缩进保存MSXML2.DomDocument?(我认为它使用MXXMLWriter)

我有一个MSXML2.DomDocument的实例.

随着缩进,我挥挥手来保存它.

此代码有效,但不会缩进:

var dom = new ActiveXObject("MSXML2.DomDocument");
// fiddle with dom here
dom.save(filename);
Run Code Online (Sandbox Code Playgroud)

我想我可以使用MXXMLWriter对象来注入缩进.

怎么样?

javascript wsh msxml6 jscript

9
推荐指数
1
解决办法
9048
查看次数

msxsl.exe的后继者?

我们打算将我们的框架从msxml4迁移到msxml6.我们在哪里使用msxsl.exe.它似乎只支持最高4.0的MSXML版本,因为命令行msxsl.exe -u 6.0版告诉我.是否有msxsl.exe的后继者?任何替代命令行处理器?

xslt msxsl msxml6

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

如何在Delphi中使用MSXML SAX组合大型XML文件

编辑:我的(不完整和非常粗糙)XmlLite标题翻译在GitHub可用

在不使用DOM的情况下,将Delphi中的大量XML文档与MSXML简单组合的最佳方法是什么?我应该使用COM组件SAXReader和XMLWriter吗?有什么好的例子吗?

转换是从根(Container)到许多大文件(60MB +)到一个巨大文件(~1GB)的所有Contents元素的简单组合.

<Container>
    <Contents />
    <Contents />
    <Contents />
</Container>
Run Code Online (Sandbox Code Playgroud)

我使用XmlWriter和XmlReaders在以下C#代码中工作,但它需要在本机Delphi进程中进行:

var files = new string[] { @"c:\bigFile1.xml", @"c:\bigFile2.xml", @"c:\bigFile3.xml", @"c:\bigFile4.xml", @"c:\bigFile5.xml", @"c:\bigFile6.xml" };

using (var writer = XmlWriter.Create(@"c:\HugeOutput.xml", new XmlWriterSettings{ Indent = true }))
{
    writer.WriteStartElement("Container");

    foreach (var inputFile in files)
        using (var reader = XmlReader.Create(inputFile))
        {
            reader.MoveToContent();
            while (reader.Read())
                if (reader.IsStartElement("Contents"))
                    writer.WriteNode(reader, true);
        }

    writer.WriteEndElement(); //End the Container element
}
Run Code Online (Sandbox Code Playgroud)

我们已经在系统的其他部分使用MSXML DOM,如果可能的话我不想添加新的组件.

delphi com sax msxml6

8
推荐指数
1
解决办法
2578
查看次数

什么变成了MSXML 4.0?

我对MSXML 4.0有所了解.

Microsoft有一个页面,提供各种MSXML 4.0对象的CLSID和ProgID:

Symbolic Name: CLSID_DOMDocument40
         GUID: {88d969c0-f192-11d4-a65f-0040963251e5}
       ProgID: Msxml2.DOMDocument.4.0

Symbolic Name: CLSID_XMLSchemaCache40
         GUID: {88d969c2-f192-11d4-a65f-0040963251e5}
       ProgID: Msxml2.XMLSchemaCache.4.0
Run Code Online (Sandbox Code Playgroud)

但是,我的Vista机器或同事的XP机器上都没有注册ProgIDCLSID.

  • MSXML 4.0只附带了一些版本的Office(例如Office 2003中)?
  • 它最初是与Windows XP一起发布的,但后来的服务包将其删除了吗?
  • 是否存在安全漏洞,并且已被删除
  • 它是否只是被depricated

我很愿意到MSXML 5.0,这在Windows XP和Windows Vista计算机-但我想,以确保我有尽可能广泛的兼容性; 我认为MSXML 4.0比MSXML 5.0更广泛.

Microsoft确实建议我使用MSXML 6.0:

建议您从早期版本的MSXML升级到MSXML 6.0.与早期的MSXML版本相比,MSXML 6.0提供了安全性和性能改进.

xml msxml msxml6

7
推荐指数
1
解决办法
3342
查看次数

在XSLT 1.0中使用前导零填充数字

我们有一个XML数字,可以在一个大的XML文件中最多3个数字,必须转换为固定长度的文本,以便加载到另一个系统.

我需要在输出中用前导零填充这个长度为15(这是固定长度的文本)

例子:

 - 1 becomes   000000000000001
 - 11 becomes  000000000000011
 - 250 becomes 000000000000250
Run Code Online (Sandbox Code Playgroud)

我试过这个:

<xsl:value-of select="substring(concat('000000000000000', msg:BankAccount/msg:Counter), 12, 15)"/>
Run Code Online (Sandbox Code Playgroud)

在开头获取15个零并获取子字符串,但我必须在子字符串中犯了一个错误,因为在结果中我得到了

0000000000000000000000009LLOYDS BANK PLC
00000000000000000000000010LLOYDS BANK PLC
Run Code Online (Sandbox Code Playgroud)

我也试过,format-number但它返回NaN

<xsl:value-of select="format-number(msg:BankAccount/msg:Counter, '000000000000000')"/>
Run Code Online (Sandbox Code Playgroud)

返回'NaN'

那么我做错了什么,最好的办法是什么?

xml string-formatting msxml6 xslt-1.0

7
推荐指数
4
解决办法
2万
查看次数

错误C2011:'MSXML2 :: IXMLDOMImplementation':'struct'类型重定义

我正在更改我的C++项目,它早在VC6中,现在正在迁移到VS 2008,使用MSXML 6而不是早期的MSXML 3.当代码在VC6中时,我们通过导入使用MSXML3

# import "msxml3.dll"
Run Code Online (Sandbox Code Playgroud)

这被替换为

# import "msxml6.dll"
Run Code Online (Sandbox Code Playgroud)

在此之后,当我编译项目时,我得到了这个和其他几个类似的错误错误C2011:'MSXML2 :: IXMLDOMImplementation':'struct'类型重新定义

上述错误位于msxml3.tlh文件中.

1)为什么仍然使用msxml3?

2)我将问题缩小到MSXML.h,它以某种方式自动包含在我的项目中.为什么是这样?

3)在MSXML.h中引用了哪个版本的MSXML?

4)为什么VC++会自动包含这么多头文件?如果我不想要包含一些头文件怎么办?

5)在c ++项目中使用MSXML6的正确方法是什么?#import,头文件?????

6)我该如何解决这个问题?

随时给我.net.更清洁.VC++项目很乱.

c++ msxml3 msxml6 visual-studio-2008

5
推荐指数
1
解决办法
3356
查看次数

XPath 查询按日期过滤

我有一些示例 XML,我在其中根据日期查询节点。

示例 XML 文档

<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<NewDataSet>
    <Table>
        <EmployeeBankGUID>dc396ebe-c8a4-4a7f-85b5-b43c1890d6bc</EmployeeBankGUID>
        <ValidFromDate>2012-02-01T00:00:00-05:00</ValidFromDate>
    </Table>
    <Table>
        <EmployeeBankGUID>2406a5aa-0246-4cd7-bba5-bb17a993042b</EmployeeBankGUID>
        <ValidFromDate>2013-02-01T00:00:00-05:00</ValidFromDate>
    </Table>
    <Table>
        <EmployeeBankGUID>2af49699-579e-4beb-9ab0-a58b4bee3158</EmployeeBankGUID>
        <ValidFromDate>2014-02-01T00:00:00-05:00</ValidFromDate>
    </Table>
</NewDataSet>
Run Code Online (Sandbox Code Playgroud)

所以基本上有三个日期:

  • 2/1/2012
  • 2/1/2013
  • 2/1/2014

使用 MSXML,我可以使用 XPath 查询按这些日期进行查询和过滤:

/NewDataSet/Table[ValidFromDate>"2013-02-12"]
Run Code Online (Sandbox Code Playgroud)

这有效,并返回一个IXMLDOMNodeList包含一个项目:

<Table>
    <EmployeeBankGUID>2af49699-579e-4beb-9ab0-a58b4bee3158</EmployeeBankGUID>
    <ValidFromDate>2014-02-01T00:00:00-05:00</ValidFromDate>
</Table>
Run Code Online (Sandbox Code Playgroud)

除了它不再起作用

使用 MSXML 的 XPath 查询;Microsoft 在 1990 年代后期创建的 xml 变体,在 W3C 标准化为完全不同形式的 XPath 之前。

DOMDocument doc = new DOMDocument();
//...load the xml...
IXMLDOMNodeList nodes = doc.selectNodes('/NewDataSet/Table[ValidFromDate>"2013-02-12"]');
Run Code Online (Sandbox Code Playgroud)

但是那个版本的 MSXML 并不“符合标准”(因为它是在有标准之前创建的)。自 2005 年以来推荐的一种,遵循标准的一种,唯一具有我需要的功能的是 MSXML 6。 …

xml xpath msxml msxml6

5
推荐指数
1
解决办法
8647
查看次数

CreateObject("MSXML2.serverXMLHTTP.6.0") 和 CreateObject("WinHttp.WinHttpRequest.5.1") 在同时运行 100 多个对象/请求时崩溃

MSXML2.serverXMLHTTP.6.0我试图使用or同时创建 100-300 个 HTTP 对象/请求WinHttp.WinHttpRequest.5.1

这些请求是使用测试应用程序在单独的线程上创建的。最多可同时运行 90 个创建对象/请求,一切正常。

当同时创建/调用超过 100 个时,应用程序会崩溃并在 KERNELBASE.dll 中出现异常。

代码:

CreateObject("MSXML2.serverXMLHTTP.6.0")
CreateObject("WinHttp.WinHttpRequest.5.1")

set obj = CreateObject("MSXML2.serverXMLHTTP.6.0")
'set obj = CreateObject("WinHttp.WinHttpRequest.5.1")

obj.open "GET", "https://httpbin.org/get", true
'https://resttesttest.com/

obj.send   ' Mostly crashes here.
obj.WaitForResponse

result =  obj.responseTEXT

set obj = Nothing
Run Code Online (Sandbox Code Playgroud)

事件查看器报告:

错误模块名称:KERNELBASE.dll,版本:6.1.7601.18015,时间戳:0x50b83c8a 异常代码:0xc00000fd 错误模块路径:C:\Windows\syswow64\KERNELBASE.dll

我尝试将 Async 设置为“true”并设置为“false”。

任何人都可以提供任何指导来调试这个吗?

vb6 vba serverxmlhttp msxml6

5
推荐指数
1
解决办法
6075
查看次数