gpt4 book ai didi

xml - 如何使用 IXMLDOCUMENT 使用 Delphi 正确创建 XML header (以 xfdf 格式填充 pdf 文档)

转载 作者:行者123 更新时间:2023-12-03 18:35:13 25 4
gpt4 key购买 nike

请我需要帮助来实现这个 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>

我不知道如何像第二个示例中那样创建“f”标签,请注意它有点不同,它在同一行中关闭,而不是在第一个示例中的最后一行之前。

这是我的代码:
....
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');

最佳答案

你得到了一个不好的结果,因为:

  • 您没有正确处理 XML 命名空间。
  • 您正在创建 fields节点作为 f 的子节点节点而不是 xfdf 的子节点节点。

  • 添加子节点时,它会继承其父节点的命名空间,除非您明确指定不同的命名空间,并且命名空间一旦分配就不能更改。

    在您的情况下,您的 xfdf节点实际上并未添加到 Adob​​e 命名空间, 你在假装它! XML 引擎不知道命名空间,所以 xfdf节点有一个空白命名空间, f子节点继承。这就是为什么 f节点以不需要的 xmlns="" 结束属性,因此没有歧义,因为它属于哪个命名空间子节点。

    要正确声明 namespace 以便 XML 引擎知道它,您需要使用 IXMLNode.DeclareNamespace()方法而不是使用 IXMLNode.Attributes属性(property)。

    您可以:
  • xfdf 上显式声明 Adob​​e 命名空间将其添加到文档后的节点。 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 上声明 Adob​​e 命名空间在您将该节点添加到文档时的节点,然后该节点将位于命名空间中,因此 ffields子节点无需调用 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com