在Delphi中,XE是否可以将XPath与TXmlDocument
组件一起使用?
我知道我可以使用后期绑定来访问MSXML2然后使用XPath:
XML := CreateOleObject('MSXML2.DOMDocument.3.0') ;
XML.async := false;
XML.SetProperty('SelectionLanguage','XPath');
Run Code Online (Sandbox Code Playgroud)
但我想知道TXmlDocument
安装Delphi XE是否支持XPath.
我在解析XML时遇到问题.
如何获得字段值se_url
和phrase
?
我需要link1_1
,link1_2
,key1
,link2_1
,link2_2
,key2
...这是在se_url
和phrase
.
我没有在谷歌中找到怎么做(也没找到关于如何使用的手册TXMLDocument
).
<doc>
<date2>20120214</date2>
<date1>20120214</date1>
<data count="116">
<row>
<search_engines count="2">
<search_engine>
<se_url>link1_1</se_url>
<se_page>1</se_page>
<se_id>2</se_id>
</search_engine>
<search_engine>
<se_url>link1_2</se_url>
<se_page>1</se_page>
<se_id>3</se_id>
</search_engine>
</search_engines>
<denial>0.4889</denial>
<visits>45</visits>
<page_views>52</page_views>
<phrase>key1</phrase>
<visit_time>126</visit_time>
<depth>1.1556</depth>
</row>
<row>
<search_engines count="2">
<search_engine>
<se_url>link2_1</se_url>
<se_page>1</se_page>
<se_id>3</se_id>
</search_engine>
<search_engine>
<se_url>link2_2</se_url>
<se_page>1</se_page>
<se_id>6</se_id>
</search_engine>
</search_engines>
<denial>0.5714</denial>
<visits>42</visits>
<page_views>50</page_views>
<phrase>key2</phrase>
<visit_time>109</visit_time>
<depth>1.1905</depth>
</row>
</data>
</doc>
Run Code Online (Sandbox Code Playgroud) 我有遗留代码(我没写它)总是包含编码属性,但重新编译到D2010,TXMLDocument不再包含编码.由于XML数据在标记和数据上都有重音字符,因此TXMLDocument.LoadFromFile只会抛出EDOMParseErros,表示在文件中找到了无效字符.相关代码:
Doc := TXMLDocument.Create(nil);
try
Doc.Active := True;
Doc.Encoding := XMLEncoding;
RootNode := Doc.CreateElement('Test', '');
Doc.DocumentElement := RootNode;
<snip>
//Result := Doc.XMl.Text;
Doc.SaveToXML(Result); // Both lines gives the same result
Run Code Online (Sandbox Code Playgroud)
在旧版本的Delphi中,生成以下行:
<?xml version="1.0" encoding="ISO-8859-1"?>
Run Code Online (Sandbox Code Playgroud)
在D2010上,生成:
<?xml version="1.0"?>
Run Code Online (Sandbox Code Playgroud)
如果我手动更改线路,所有工作都像过去几年一直工作.
更新:XMLEncoding是一个常量,定义如下
XMLEncoding = 'ISO-8859-1';
Run Code Online (Sandbox Code Playgroud) 我是delphi的新手,现在我必须阅读创建一个xml.我的代码如下:
function foo.createXMLDocument(): TXMLDocument;
var
res: TXMLDocument;
rootNode: IXMLNode;
sl : TStringList;
begin
res := TXMLDocument.Create(nil);
res.Active := true;
rootNode := res.AddChild('label');
// create string for debug purposes
sl := TStringList.Create;
sl.Assign(res.XML);// sl is empty after this assignment
//add more elements
generateDOM(rootNode);
Result := res;
end;
Run Code Online (Sandbox Code Playgroud)
问题是,子节点数增加但res.XML为空.更不用说generateDOM过程中的其余元素似乎没有做任何事情.在你的帮助下,我将非常高兴.
我正在运行时创建一个TXMLDocument实例,以加载和解析XML文件.您可以查看以下代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;
type
Txml = class(TForm)
// XMLDocument1: TXMLDocument;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
xml: Txml;
implementation
{$R *.dfm}
procedure Txml.FormCreate(Sender: TObject);
var i,j:integer;
aNode:IXMLNode;
ws:String;
XMLDocument1:TXMLDocument;
begin
Memo1.Lines.Clear;
XMLDocument1 := TXMLDocument.Create(nil);
try
XMLDocument1.LoadFromFile('C:\a.xml');
XMLDocument1.Active := true;
aNode := XMLDocument1.ChildNodes.First;
while aNode<>nil do
begin
for i := 0 to aNode.ChildNodes.Count-1 do …
Run Code Online (Sandbox Code Playgroud) 当我尝试使用DTD读取XML文档(eagle文件)时,我收到错误:
Project xx引发异常类EDOMParserError并显示消息'DTD is prohibited'
XML标头如下所示:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE eagle SYSTEM "eagle.dtd">
Run Code Online (Sandbox Code Playgroud)
如果我删除第二行...
<!DOCTYPE eagle SYSTEM "eagle.dtd">
Run Code Online (Sandbox Code Playgroud)
......一切正常
在一些谷歌搜索之后,似乎MSXML解析器默认情况下将一个名为'prohibitDTD'的选项设置为true(在早期版本中它是假的).
但是,似乎无法从TXMLDocument类将此选项设置为false.一个解决方案似乎是重新编译.pas库或使用CoCreateInstance()自行创建接口.
我在Delphi中看到的所有示例都有将这些示例转换为C++ Builder的困难.
有谁知道如何使用C++ Builder XE2读取DTD XML文档?
我的示例代码......
#include <xmldoc.hpp>
_di_IXMLNode XMLObject;
TXMLDocument *XMLDocument = new TXMLDocument(this);
XMLDocument->LoadFromFile(fileName); // <----- Exception EDOMParserError
XMLObject = XMLDocument->DocumentElement;
Run Code Online (Sandbox Code Playgroud)
谢谢...
我必须创建具有更多具有相同名称的值的节点的xml文档
<PstlAdr>
<Ctry>SI</Ctry>
<AdrLine>Gosposvetska 12</AdrLine>
<AdrLine>Kranj</AdrLine>
</PstlAdr>
Run Code Online (Sandbox Code Playgroud)
使用oNode.ChildValues['AdrLine'] := ...
它是不可能的 - 只能添加一个具有相同名称的值.如何添加更多具有相同名称的值?
最好的祝福
最近我们将代码从Delphi 2009升级到Delphi XE并更新了我们的Indy组件(不确定这是否相关).
但从那时起,我们在加载和保存XML文件时在Windows Server 2003计算机上出现了错误.
XMLDoc.LoadFromFile()
XMLDoc.SaveToFile()
Run Code Online (Sandbox Code Playgroud)
DLL msvcrt.dll在Windows Server 2003(300kb左右)上要小得多,相比之下在其他操作系统上超过600kb ...因此它在该文件中丢失了一些内容并导致错误......
有谁知道如何解决这一问题?或者TXMLDocument
我可以尝试替代吗?
有没有办法在Delphi中比较两个xml节点?
我正在使用MSXML解析器并将xml加载到IXmlDOMDocument2中.节点存储在IXmlDOMNode中.
如果有帮助的话,我可以使用Delphi的TXMLDocument.我不想下载任何第三方组件.
我只是想比较节点的结构,而不是值.
我看到了一个类似于Java的帖子/实用程序,但对于Delphi没什么.
谢谢!
我有一些包含格式良好的 XML 的文本字符串。
我希望能够(1)将这些字符串转换为IXMLNodes
(2)将它们附加到现有的XMLDocument
. 最好不声明新的XMLDocument
第一个。
这似乎不可能?
有没有什么简单的方法可以完成等效的事情?我最初的想法是使用IXMLNode.XML
(string) 属性并插入新字符串。IXMLNode.XML
只读则不然。
这是一个例子,如果我在 a 中有以下字符串TStringList
,
<Property Name="Version" RttiType="tkString"></Property>
<Property Name="ShowSubunit" RttiType="tkBoolean"></Property>
Run Code Online (Sandbox Code Playgroud)
我有以下 XML,已加载到 中TXMLDocument
,我如何轻松地将上面的两行附加到下面TXMLDocument
?
<Program Name="PFOO">
<Class Name="CFOO">
<Property Name="DBN" RttiType="tkString"/>
<Property Name="SDate" RttiType="tkClass" ClassType="TXSDATE">12/30/1899</Property>
<Property Name="XForm" RttiType="tkEnumeration">xfXML</Property>
<Property Name="Singleton" RttiType="tkBoolean">True</Property>
</Class>
</Program>
Run Code Online (Sandbox Code Playgroud)
还有其他(简单)方法可以实现此目的(请不要对 XML 属性进行受保护的黑客攻击)?
谢谢你!
txmldocument ×10
delphi ×9
xml ×4
delphi-xe ×2
delphi-2006 ×1
delphi-2010 ×1
dll ×1
dtd ×1
encoding ×1
ixmldomnode ×1
msxml ×1
vcl ×1
xml-parsing ×1
xmlnode ×1
xmlnodelist ×1
xpath ×1