- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请我需要帮助来实现这个 xml,我对第三行有一个问题,这就是我的代码得到的:
<?xml version="1.0" encoding="utf-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<f xmlns="" href="myExample.pdf">
<fields>
<field name="chk01">
<value>X</value>
</field>
<field name="chk02">
<value>X</value>
</field>
<field name="edt11">
<value>Some text</value>
</field>
</fields>
</f>
</xfdf>
<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<f href="myExample.pdf"/>
<fields>
<field name="chk01">
<value>X</value>
</field>
<field name="chk02">
<value>X</value>
</field>
<field name="edt11">
<value>Some text</value>
</field>
</fields>
</xfdf>
....
Var
XML : IXMLDOCUMENT;
RootNode, NodeLevel1, CurNode : IXMLNODE;
Begin
XML := NewXMLDocument;
XML.Encoding := 'utf-8';
XML.Options := [doNodeAutoIndent];
RootNode := XML.AddChild('xfdf');
RootNode.Attributes['xmlns']:= 'http://ns.adobe.com/xfdf/';
RootNode.Attributes['xml:space']:= 'preserve';
RootNode := XML.DocumentElement.AddChild('f');
RootNode.Attributes['href']:= 'myExample.pdf';
NodeLevel1 := RootNode.AddChild('fields');
CurNode := NodeLevel1.AddChild('field');
CurNode.Attributes['name'] := 'chk01';
CurNode := CurNode.AddChild('value');
CurNode.Text:= 'X';
CurNode := NodeLevel1.AddChild('field');
CurNode.Attributes['name'] := 'chk02';
CurNode := CurNode.AddChild('value');
CurNode.Text:= 'X';
CurNode := NodeLevel1.AddChild('field');
CurNode.Attributes['name'] := 'edt11';
CurNode := CurNode.AddChild('value');
CurNode.Text:= 'Some text';
XMl.SaveToFile('C:\New.fdf');
最佳答案
你得到了一个不好的结果,因为:
fields
节点作为 f
的子节点节点而不是 xfdf
的子节点节点。 xfdf
节点实际上并未添加到 Adobe 命名空间,
你在假装它! XML 引擎不知道命名空间,所以
xfdf
节点有一个空白命名空间,
f
子节点继承。这就是为什么
f
节点以不需要的
xmlns=""
结束属性,因此没有歧义,因为它属于哪个命名空间子节点。
IXMLNode.DeclareNamespace()
方法而不是使用
IXMLNode.Attributes
属性(property)。
xfdf
上显式声明 Adobe 命名空间将其添加到文档后的节点。 xfdf
节点本身不会在命名空间中(很明显 IXMLNode.NamespaceURI
属性仍然为空),但随后可以在添加 f
时显式应用命名空间和 fields
子节点:const
NsAdobeXfdf = 'http://ns.adobe.com/xfdf/';
var
XML: IXMLDocument;
RootNode, FNode, FieldsNode, FieldNode: IXMLNode;
begin
XML := NewXMLDocument;
XML.Encoding := 'utf-8';
XML.Options := [doNodeAutoIndent];
RootNode := XML.AddChild('xfdf'); // <-- xfdf is not in any namespace
RootNode.DeclareNamespace('', NsAdobeXfdf); // <-- declare the namespace
RootNode.Attributes['xml:space'] := 'preserve';
FNode := RootNode.AddChild('f', NsAdobeXfdf); // <-- f is in the Adobe namespace
FNode.Attributes['href'] := 'myExample.pdf';
FieldsNode := RootNode.AddChild('fields', NsAdobeXfdf); // <-- fields is in the Adobe namespace
FieldNode := FieldsNode.AddChild('field'); // <-- inherits namespace from fields
FieldNode.Attributes['name'] := 'chk01';
FieldNode.AddChild('value').Text := 'X'; // <-- inherits namespace from field
FieldNode := FieldsNode.AddChild('field'); // <-- inherits namespace from fields
FieldNode.Attributes['name'] := 'chk02';
FieldNode.AddChild('value').Text := 'X'; // <-- inherits namespace from field
FieldNode := FieldsNode.AddChild('field'); // <-- inherits namespace from fields
FieldNode.Attributes['name'] := 'edt11';
FieldNode.AddChild('value').Text := 'Some text'; // <-- inherits namespace from field
XML.SaveToFile('C:\New.fdf');
end;
xfdf
上声明 Adobe 命名空间在您将该节点添加到文档时的节点,然后该节点将位于命名空间中,因此 f
和 fields
子节点无需调用 DeclareNamespace()
即可继承它手动(AddChild()
在内部为您调用它):const
NsAdobeXfdf = 'http://ns.adobe.com/xfdf/';
var
XML: IXMLDocument;
RootNode, FNode, FieldsNode, FieldNode: IXMLNode;
begin
XML := NewXMLDocument;
XML.Encoding := 'utf-8';
XML.Options := [doNodeAutoIndent];
RootNode := XML.AddChild('xfdf', NsAdobeXfdf); // <-- xfdf is in the Adobe namespace
RootNode.Attributes['xml:space'] := 'preserve';
FNode := RootNode.AddChild('f'); // <-- inherits namespace from xfdf
FNode.Attributes['href'] := 'myExample.pdf';
FieldsNode := RootNode.AddChild('fields'); // <-- inherits namespace from xfdf
FieldNode := FieldsNode.AddChild('field'); // <-- inherits namespace from fields
FieldNode.Attributes['name'] := 'chk01';
FieldNode.AddChild('value').Text := 'X'; // <-- inherits namespace from field
FieldNode := FieldsNode.AddChild('field'); // <-- inherits namespace from fields
FieldNode.Attributes['name'] := 'chk02';
FieldNode.AddChild('value').Text := 'X'; // <-- inherits namespace from field
FieldNode := FieldsNode.AddChild('field'); // <-- inherits namespace from fields
FieldNode.Attributes['name'] := 'edt11';
FieldNode.AddChild('value').Text := 'Some text'; // <-- inherits namespace from field
XML.SaveToFile('C:\New.fdf');
end;
xmlns=""
f
上的属性和
fields
节点,因为它们属于
xfdf
中声明的命名空间节点,后续子节点将按预期继承命名空间:
<?xml version="1.0" encoding="utf-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<f href="myExample.pdf"/>
<fields>
<field name="chk01">
<value>X</value>
</field>
<field name="chk02">
<value>X</value>
</field>
<field name="edt11">
<value>Some text</value>
</field>
</fields>
</xfdf>
关于xml - 如何使用 IXMLDOCUMENT 使用 Delphi 正确创建 XML header (以 xfdf 格式填充 pdf 文档),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39827589/
我有一个 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
我是一名优秀的程序员,十分优秀!