这似乎是一个常见的问题,虽然我无法在SO上找到它.
我应该在我的应用程序中使用哪个版本的MSXML,更重要的是,我该如何决定?
有MSXML3,4,5和6.
我最近在使用MSXML v4的call-wcf-service-by-vbscript中发布了一些代码.AnthonyWJones发布我不应该使用4,而是使用3或6,但可能是3.当然不是v5!
为什么?我想更多地了解选择在我的应用中使用的MSXML版本的标准.
奖金问题:有没有人总结过各种版本的MSXML随时间的差异?
截至目前的摘要:
我刚安装IE10在我的Windows 7,而且我发现,即使我很高兴,从AJAX请求个XML现在可以兼容DOM文档,就像一个相当基本的功能document.evaluate
是仍然不支持.
更糟糕的是,由于这些个XML是不是定制的微软IXMLDocument
对象,节点不支持selectNodes
和selectSingleNode
了.最后,似乎IE10不支持DOM Level 3 XPath或MSXML Xpath.
说真的,微软?有什么我想念的吗?
当然,我可以使用querySelector
和querySelectorAll
,但我不想失去相当多的向后兼容性.
否则,仍然可以使用此行请求MSXML文档
try {xhr.responseType = "msxml-document";} catch(e) {}
Run Code Online (Sandbox Code Playgroud)
如规定在这里,但我认为这将是很好对付,最后,在IE标准DOM文档了.
那么,有没有办法在IE10中使用带有标准DOM文档的XPath?
更新2013年6月26日 IE11尚未稳定,但仍然不支持document.evaluate
.如果它不支持它在稳定的版本,我怀疑它会永远支持它.毋庸置疑,这是荒谬的.
我知道你可以在DOM节点中使用querySelector
/ All
,但它在IE9及更低版本中不受支持,这仍然是非常常用的,无论如何XPath比选择器更强大.
幸运的是(如果可以这么说),你仍然可以设置xhr.responseType = "msxml-document"
.有那么一刻,我担心你再也不能那样做了......
更新23/11/2013 IE11现在稳定,但遗憾的是,它不支持document.evaluate
.随着重量级XML文档在Web应用程序中越来越少地使用JSON或其他光表示法格式,这变得不那么成问题了,但仍然如此.
设置responseType
属性仍然提供遗留的XML文档,所以我猜没有丢失.不过,我不知道IE12是否会成立.
更新15/8/2015现在听起来很荒谬,但Edge现在支持document.evaluate
.就在(几乎)一切都切换到JSON进行数据交换时.嗯,迟到总比没有好,我想.
我正在使用MSXML的XmlHttpRequest对象发出请求:
IXMLHttpRequest http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.send();
Run Code Online (Sandbox Code Playgroud)
并且send
成功了,我得到了我的xml数据.
除了XmlHttpRequest
实际上没有打网络(我可以看到没有发出实际的http请求).并且Process Monitor显示文件实际上是从我的缓存中提供的:
所以我想指示XmlHttpRequest
用户代理任何超过0秒的缓存内容都太旧了.执行此操作的标准方法是添加请求标头:
Cache-Control: max-age=0
Run Code Online (Sandbox Code Playgroud)
发送请求:
http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "max-age=0");
http.send();
Run Code Online (Sandbox Code Playgroud)
并且send
成功了,我得到了我的xml数据.
除了XmlHttpRequest
实际上没有打网络(我可以看到没有发出实际的http请求).Process Monitor显示文件实际上是从我的缓存中提供的.
那有什么不对?是max-age
不是在做什么我想它呢?
来自RFC 2616 - 超文本传输协议,第14部分:标题字段定义:
其他指令允许用户代理修改基本过期机制.可以在请求中指定这些指令:
max-age
表示客户端愿意接受年龄不大于指定时间(秒)的响应.除非还包括最大指令,否则客户不愿意接受陈旧的响应.
这正是我想要的.
是Cache-Control: max-age=0
不是我想要的,或者是MSXML的XmlHttpRequest
对象错误?
这是MSXML XmlHttpRequest
COM对象:
该max-age
指令由客户端添加,以供所有要遵守的缓存使用.来自RFC:
Cache-Control通用头字段用于指定请求/响应链中的所有缓存机制必须遵守的指令 …
我试图将xml数据导入excel ..所以代码的第一行是
Dim XMLDOC As MSXML2.DOMDocument
这会给出一个错误"用户定义的类型未定义"
我几个月来一直在关注这个问题,而且我主要发现网站都在问同样的问题.
我的答案却发现总是面向.NET或C++或参与XSLT.
我该如何解决
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) 我们将SSL证书更新为SHA2,但中间证书为SHA1.Chrome和其他浏览器已经确定整个链必须是SHA2.我们的客户在关注地址栏中的黄色警告.有传言称,在几个月内,Chrome和其他浏览器将以停止屏幕取代轻度不引人注目的谨慎.我们当然不希望这样!
...
所以我们重新颁发了证书,新的证书由SHA2中间人签名.当我们使用该证书加密我们服务器上的流量时,我们使用MSXML2.ServerXMLHTTP(在Windows Server 2003上运行)访问该服务器上的远程Web服务的应用程序无法再连接.
在研究之后,我们应用了这两个看起来可能已解决该问题的修补程序:
https://support.microsoft.com/kb/938397/en-us https://support.microsoft.com/kb/968730/en-us
但问题仍然存在.使用SHA1中间件将证书切换回SHA2,我们没有任何问题.
我们已在受信任的商店中安装了中间SHA2证书,但问题仍然存在.
我们已经尝试指定MSXML2.ServerXMLHTTP的所有版本,但都失败了.
ASP代码:
function query(xml)
dim xmlhttp, xmlDoc, url
url = application("component_url")
set xmlhttp = server.createobject("MSXML2.ServerXMLHttp")
call xmlhttp.open ("POST", url, false)
call xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
on error resume next
err.clear
call xmlhttp.send(xml)
if err.number <> 0 then
call sendAlert("An error has occurred while trying to send your request", message)
else
dim rt
rt = ConvertUtf8BytesToString(xmlhttp.responseBody)
set xmlDoc = server.createobject("MSXML2.DomDocument")
xmlDoc.loadXml(rt)
end if
on error goto 0
set query = xmlDoc
set xmlHttp …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个C#应用程序,它使用一些XML文件和System.Xml中的一些类.同事坚持在我们的安装中添加MSXML6可再发行组件以及.NET框架,但我认为.NET框架无论如何都不会使用或需要MSXML.我很清楚,不支持使用.NET中的MSXML,但我认为理论上System.Xml本身可以将MSXML包装在较低级别.我没有找到任何确定的.NET有自己的实现,但我也找不到任何暗示需要MSXML的东西.
帮我解决辩论.System.Xml是否使用MSXML?
我正在编写一些我想在linux和Windows下使用的xlst文件.在这个文件中,我使用node-set函数,该函数在不同的命名空间中为MSXML和xsltproc(分别为"urn:schemas-microsoft-com:xslt"和" http://exslt.org/common ")声明.是否有任何平台独立的方式使用节点集?