GVKun编程网logo

Delphi 中的 XMLDocument 类详解(9) - 关于 HasChildNodes 与 IsTextElement(delphi xml解析)

12

最近很多小伙伴都在问Delphi中的XMLDocument类详解(9)-关于HasChildNodes与IsTextElement和delphixml解析这两个问题,那么本篇文章就来给大家详细解答一下

最近很多小伙伴都在问Delphi 中的 XMLDocument 类详解(9) - 关于 HasChildNodes 与 IsTextElementdelphi xml解析这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展delphi txmldocument报错 no active document、delphi – 通过TXMLDocument访问IXMLDOMDocument2?、Delphi 中的 XMLDocument 类详解 (14) - 遍历 XML 文件、Delphi 中的 XMLDocument 类详解 - 创建与保存 xml等相关知识,下面开始了哦!

本文目录一览:

Delphi 中的 XMLDocument 类详解(9) - 关于 HasChildNodes 与 IsTextElement(delphi xml解析)

Delphi 中的 XMLDocument 类详解(9) - 关于 HasChildNodes 与 IsTextElement(delphi xml解析)

总结

以上是小编为你收集整理的Delphi 中的 XMLDocument 类详解(9) - 关于 HasChildNodes 与 IsTextElement全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

delphi txmldocument报错 no active document

delphi txmldocument报错 no active document

总结

以上是小编为你收集整理的delphi txmldocument报错 no active document全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

delphi – 通过TXMLDocument访问IXMLDOMDocument2?

delphi – 通过TXMLDocument访问IXMLDOMDocument2?

我有一些使用Delphi的T XMLDocument类的工作代码,并使用TransformNode方法执行XSLT转换.

但是,我需要启用XSLT Javascript函数(< msxml:script>标记)和 – 经过大量谷歌搜索 – 这意味着我需要将IXMLDOMDocument2的AllowXsltScript属性设置为true.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms760290(v=vs.85).aspx

我已经成功实现了这一点 – 但只能通过在msxmldom.pas中修改Delphi库函数CreateDOMDocument的源代码.

function CreateDOMDocument: IXMLDOMDocument;
var doc :IXMLDOMDocument2;
begin

  doc := TryObjectCreate([CLASS_DOMDocument60,CLASS_DOMDocument40,CLASS_DOMDocument30,CLASS_DOMDocument26,msxml.CLASS_DOMDocument]) as IXMLDOMDocument2;
  if not Assigned(doc) then
    raise DOMException.Create(SMSDOMnotinstalled);
  doc.setProperty('AllowXsltScript',true);  // Allow XSLT scripts!!
  Result := doc;
end;

显然这远非令人满意 – 所以如何在不修改库代码的情况下访问IXMLDOMDocument2对象?

解决方法

您可以通过MSXMLDOMDocumentCreate变量覆盖create函数:

unit Unit27;

interface

uses
  xmldoc,xmlintf,msxml,msxmldom,Forms,SysUtils,ActiveX,ComObj,XmlDom,XmlConst,Windows,Messages,Classes,Controls,StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TryObjectCreate(const GuidList: array of TGuid): IUnkNown;
var
  I: Integer;
  Status: HResult;
begin
  Status := S_OK;
  for I := Low(GuidList) to High(GuidList) do
  begin
    Status := CoCreateInstance(GuidList[I],nil,CLSCTX_INPROC_SERVER or
      CLSCTX_LOCAL_SERVER,Idispatch,Result);
    if Status = S_OK then Exit;
  end;
  OleCheck(Status);
end;

function CreateDOMDocument2: IXMLDOMDocument;

var
  Doc2 : IXMLDOMDocument2;

begin
  Doc2 := TryObjectCreate([CLASS_DOMDocument60,msxml.CLASS_DOMDocument]) as IXMLDOMDocument2;
  if not Assigned(Doc2) then
    raise DOMException.Create(SMSDOMnotinstalled);
  Doc2.setProperty('AllowXsltScript',true);
  Result := Doc2;
end;


procedure TForm1.FormCreate(Sender: TObject);

var
 Doc : IXMLDocument;

begin
 Doc := TXMLDocument.Create(nil);
 Doc.LoadFromFile('c:\temp\test.xml');
end;


initialization
 MSXMLDOMDocumentCreate := CreateDOMDocument2;
end.

Delphi 中的 XMLDocument 类详解 (14) - 遍历 XML 文件

Delphi 中的 XMLDocument 类详解 (14) - 遍历 XML 文件

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;

type
  TForm1 = class(TForm)
    XMLDocument1: TXMLDocument;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


//读取 xml 的函数
{
  功能1: 传入一个节点参数, 返回节点及其包含的所有内容;
  功能2: 排除了空节点.
}
function ReadXml(node: IXMLNode): string;
var
  nodeList,attrList: IXMLNodeList;
  str,strName,strValue: string;
  i: Integer;
begin
  Result := '''';
  if not node.HasChildNodes then Exit;

  attrList := node.AttributeNodes;      {根节点的属性列表}
  nodeList := node.ChildNodes;          {根节点下的子节点列表}

  str := ''<'' + node.NodeName;

  {先读取属性}
  for i := 0 to attrList.Count - 1 do
  begin
    strName := attrList[i].NodeName;
    strValue := attrList[i].NodeValue;
    str := str + '' '' + strName + ''='' + AnsiQuotedStr(strValue, ''"'');
  end;
  str := str + ''>'' + sLineBreak; {sLineBreak 是常量, 相当于 #13#10}

  {读取子节点}
  for i := 0 to nodeList.Count - 1 do
  begin
    strName := nodeList[i].NodeName;
    if nodeList[i].IsTextElement then
    begin
      strValue := nodeList[i].NodeValue;
      str := str + ''<'' + strName + ''>'' + strValue + ''</'' + strName + ''>'' + sLineBreak;
    end else if nodeList[i].HasChildNodes then
    begin
      str := str + ReadXml(nodeList[i]);               {这是最关键的递归调用}
      str := str + ''</'' + strName + ''>'' + sLineBreak;  {封口}
    end;
  end;

  str := str + ''</'' + node.NodeName + ''>''; {封口}

  Result := str;
end;


//调用测试(1):
procedure TForm1.Button1Click(Sender: TObject);
var
  str,s1,s2: string;
begin
  XMLDocument1.LoadFromFile(''c:\temp\test.xml'');
  {必须用万一提供的 xml 测试文件, 才能有相同的返回值}


  {读取文件头}
  s1 := AnsiQuotedStr(XMLDocument1.Version, ''"'');  {读出版本, 并添加双引号}
  s2 := AnsiQuotedStr(XMLDocument1.Encoding, ''"''); {读出字符集, 并添加双引号}
  str := Format(''<?xml version=%s encoding=%s?>'',[s1,s2]); {这就是文件头了}

  str := str + sLineBreak + ReadXml(XMLDocument1.DocumentElement);

  ShowMessage(str); {返回 xml 包含问头在内的所有内容}
end;


//调用测试(2)
procedure TForm1.Button2Click(Sender: TObject);
var
  str: string;
  node: IXMLNode;
begin
  XMLDocument1.LoadFromFile(''c:\temp\test.xml'');

  node := XMLDocument1.DocumentElement.ChildNodes[0];

  str := ReadXml(node);

  ShowMessage(str); {返回返回根节点下第一个子节点的所有内容}
end;

end.

 
 
 
 
 

 

 

  
  

Delphi 中的 XMLDocument 类详解 - 创建与保存 xml

Delphi 中的 XMLDocument 类详解 - 创建与保存 xml

总结

以上是小编为你收集整理的Delphi 中的 XMLDocument 类详解 - 创建与保存 xml全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

我们今天的关于Delphi 中的 XMLDocument 类详解(9) - 关于 HasChildNodes 与 IsTextElementdelphi xml解析的分享已经告一段落,感谢您的关注,如果您想了解更多关于delphi txmldocument报错 no active document、delphi – 通过TXMLDocument访问IXMLDOMDocument2?、Delphi 中的 XMLDocument 类详解 (14) - 遍历 XML 文件、Delphi 中的 XMLDocument 类详解 - 创建与保存 xml的相关信息,请在本站查询。

本文标签: