我该如何解决
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与名称空间一起使用? …
我有一些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包含一个名称空间声明:
的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查询默认命名空间?
注意:
我已经知道如何查询xml中的非默认命名空间 ; 你用:
doc.setProperty("SelectionNamespaces",
"xmlns="http://schemas.microsoft.com/developer/msbuild/2003");
Run Code Online (Sandbox Code Playgroud)我已经知道如何查询.NET中的默认命名空间.您使用命名空间管理器,为默认命名空间命名,然后使用该名称进行查询,然后您可以查询非默认命名空间,因为它不再是默认命名空间
我可以xmlns
从我收到的XML字符串中删除令人反感的文本,但我宁愿"以正确的方式去做"
如何使用MSXML 查询"默认"或"未命名"命名空间?
注意:实际上我正在使用SQL Server的XML ShowPlan输出:
<?xml version="1.0" …
Run Code Online (Sandbox Code Playgroud) 我有一个MSXML2.DomDocument的实例.
随着缩进,我挥挥手来保存它.
此代码有效,但不会缩进:
var dom = new ActiveXObject("MSXML2.DomDocument");
// fiddle with dom here
dom.save(filename);
Run Code Online (Sandbox Code Playgroud)
我想我可以使用MXXMLWriter对象来注入缩进.
怎么样?
我们打算将我们的框架从msxml4迁移到msxml6.我们在哪里使用msxsl.exe.它似乎只支持最高4.0的MSXML版本,因为命令行msxsl.exe -u 6.0版告诉我.是否有msxsl.exe的后继者?任何替代命令行处理器?
编辑:我的(不完整和非常粗糙)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,如果可能的话我不想添加新的组件.
我对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机器上都没有注册ProgID或CLSID.
我很愿意到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数字,可以在一个大的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'
那么我做错了什么,最好的办法是什么?
我正在更改我的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++项目很乱.
我有一些示例 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)
所以基本上有三个日期:
使用 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。 …
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”。
任何人都可以提供任何指导来调试这个吗?