- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
给出下面的 XML 示例;
<role>
<access>
<control>
<type>group</type>
<object>COMPUTER\Administrators</object>
</control>
<control>
<type>user</type>
<object>COMPUTER\Admin</object>
</control>
</access>
</role>
代码:
var
Doc: IXMLDOMDocument2;
Node: IXMLDOMNode;
procedure Test;
begin
Doc := CreateOleObject('Microsoft.XMLDOM') as IXMLDomDocument2;
Doc.load('test.xml');
// This Works
Node := Doc.selectSingleNode('//role/access/control');
// But this does not work:
Node := Doc.selectSingleNode('//role/access/control[type = ''group'']');
// EDIT: This does work, but how to combine with object=COMPUTER\Admin?
Node := Doc.selectSingleNode('//role/access/control[type="group"]');
// EDIT: This does not work either
Node := Doc.selectSingleNode('//role/access/control[type="group" and object="COMPUTER\Administrators"]');
end;
最佳答案
其中任何一个都将修复查询:
1) 创建dom后添加如下行:
Doc.setProperty('SelectionLanguage', 'XPath');
2) 更好的是,您可以更明确地说明您正在创建哪个版本的解析器,并将构造行替换为:
Doc := CoDOMDocument60.Create;
如果查询没有找到任何东西,Node 将为空。
if not Assigned(Node) then...
MSXML3 解析器的默认查询语言是 XSLPatterns。您需要将其显式设置为 XPath。自从我不得不处理它以来已经有一段时间了,但我假设 CreateOleObject 行必须创建我的默认 MSXML 解析器。
更新:您问题后半部分的解决方案无耻地(经许可)从亲切的 TLama 那里窃取。 :)
忽略目标文档格式和错误处理,例如这样:
procedure TForm1.Button2Click(Sender: TObject);
var
XMLRoot: IXMLDOMNode;
XMLChild: IXMLDOMNode;
XMLDocument: IXMLDOMDocument2;
begin
XMLDocument := CreateOleObject('Microsoft.XMLDOM') as IXMLDomDocument2;
XMLDocument.load('XMLFile.xml');
XMLRoot := XMLDocument.selectSingleNode('//role/access');
if Assigned(XMLRoot) then
begin
XMLRoot := XMLRoot.appendChild(XMLDocument.createElement('control'));
XMLChild := XMLRoot.appendChild(XMLDocument.createElement('type'));
XMLChild.text := 'user';
XMLChild := XMLRoot.appendChild(XMLDocument.createElement('object'));
XMLChild.text := 'COMPUTER\TLama';
XMLDocument.save('XMLFile.xml');
end;
end;
关于xml - 使用 IXMLDocument 在 XML 中搜索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12166372/
我有一个 XML 文件,它最初是使用空格缩进格式化的(每个嵌套项有 2 个空格)。 当我使用 IXMLDocument 加载和保存此文件时,空格缩进变为制表符(代码 #9)。 代码如下: var
我正在使用 Delphi 2010,仅使用库存标准 VCL 库。目标系统是win32。 如果我有对 IXMLDocument 的引用,如何获取 IXMLDocument 包装的基础对象的 IXMLDO
我正在尝试像这样从 IXMLDocument 中获取 xml 文本。 Doc.XML.Text; 这给了我 xml 文本,但它包含 xml 声明。 有没有办法获取不包括 xml 声明的 xml 文本
给出下面的 XML 示例; 如何轻松检查给定对象是否存在? 如何轻松添加组或用户类型的项目? (加一整 block ) group
我用 NewXMLDocument()生成我的数据的 XML 文档。 有一个SaveToXML()方法将文档保存到 XML 格式的字符串变量。 问题是 XML 字符串不包含 "encoding"头标签
使用 IXMLDocument(msxml 包装器)时,是否有理由在我的 DLL 函数中使用 CoInitialize? (或与此相关的其他 com 对象) 调用应用程序/线程是否负责调用CoInit
我正在尝试使用 Delphi TXMLDocument 解析器读取 XML 文件,但我无法访问节点中的数据,而且我无法弄清楚为什么会发生这种情况。 XML 是: 111 IT0123456
我正在尝试在 Delphi Berlin 10.1 中创建 XML我需要获取这样的文件: IT 01234567890
这个问题已经有答案了: What is the default value of 'Result' in Delphi? (3 个回答) 已关闭 6 年前。 下面的函数接受 XML 输入,对其进行解析
请我需要帮助来实现这个 xml,我对第三行有一个问题,这就是我的代码得到的: X X
我是一名优秀的程序员,十分优秀!