- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
使用此代码获取站点的 rss。此代码适用于我的计算机和许多其他计算机。但在某些计算机(Windows XP 或 7)中,我收到此错误:未安装 MSXML
我该如何解决这个问题?怎么了?
代码如下:
procedure My_Thread.Execute;
var
http : tidhttp;
strm : tmemorystream;
str,sTitle, sDec ,er : string;
StartItemNode : IXMLNode;
ANode : IXMLNode;
XMLDoc : IXMLDocument;
begin
http := tidhttp.Create();
strm := tmemorystream.Create;
try
http.Get('http://www.sample.com/rss.xml',strm); //Download the RSS file
SetString(str,PANSIChar(strm.Memory),strm.Size);
XMLDoc := LoadXMLData(str);
StartItemNode := XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item');
ANode := StartItemNode;
i := 0;
repeat
inc(i);
sTitle := ANode.ChildNodes['title'].Text;
sDec := ANode.ChildNodes['description'].Text;
Synchronize(procedure begin //Synchronize? I'm using threads
case I of
1: begin
main_frm.edit1.text := sTitle; //main_frm is my form
main_frm.edit2.text := sDec;
end;
2: begin
main_frm.edit3.text := sTitle;
main_frm.edit4.text := sDec;
end;
3: begin
main_frm.edit5.text := sTitle;
main_frm.edit6.text := sDec;
end;
end;
ANode := ANode.NextSibling;
end);
until ANode = nil;
http.Free;
strm.Free;
except
on E: Exception do
begin
er := e.Message;
Synchronize(procedure begin
ShowMessage(er);
end);
end;
end;
end;
如您所见,我正在使用线程。所以需要 Synchronize
。
最佳答案
在 Windows 上,TXMLDocument
默认使用 MSXML,它使用 COM 对象。您的线程在加载 XML 之前未调用 CoInitialize/Ex()
,因此 COM 无法实例化 IXMLDocument
尝试在内部创建的任何 MSXML COM 对象(它尝试创建多个 COM 对象以发现实际安装了哪个版本的 MSXML)。您看到的错误消息表示所有 MSXML COM 对象都未能实例化。
您必须在访问 COM 对象的每个线程上下文中调用 CoInitialize/Ex()
,例如:
procedure My_Thread.Execute;
var
...
begin
CoInitialize(nil);
try
...
XMLDoc := LoadXMLData(str);
try
...
finally
// Since CoInitialize() and CoUninitialize() are being called in the same
// method as local COM interface variables, it is very important to release
// the COM interfaces before calling CoUninitialize(), do not just let them
// release automatically when they go out of scope, as that will be too late...
StartItemNode := nil;
ANode := nil;
XMLDoc := nil;
end;
...
finally
CoUninitialize;
end;
end;
更新:如果您不想依赖于此:您可以使用您选择的不同 XML 库,而不必使用 MSXML:
Using the Document Object Model
Selecting an XML Vendor
When you build an application, RAD Studio uses the default built-in XML vendor, MSXML.
If you do not specify a different XML vendor, your application does not have XML support on other platforms than Windows, and you see a run-time exception when you run your application in other platforms. For cross-platform applications, OmniXML is currently the best choice, as it shows much better performance than ADOM.
To choose a different XML vendor, add a reference to the unit of the vendor into the unit where you use the RTL XML features, such as the
TXMLDocument
class. If you add more than one XML vendor unit, the first unit referenced is used as XML vendor. If you need to override this behavior, change the value of theDefaultDOMVendor
global variable to the global variable of the XML vendor that you want to use.Note: You can look up the unit and the global variable of each XML vendor in the List of Built-in XML Vendors above.
When you use the
TXMLDocument
component, you can choose an XML vendor using itsDOMVendor
property. When you change the value ofDOMVendor
, the unit that uses the component is configured to use the specified XML vendor, so that you do not need to change unit references or theDefaultDOMVendor
global variable manually.
关于XML:未安装 MSXML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20478739/
网络服务器正在返回状态代码和描述以响应 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
我是一名优秀的程序员,十分优秀!