2

このxmlを達成するために助けが必要です.3行目に問題があります.これは私のコードで得られるものです:

<?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>

2 番目の例のように "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');
4

2 に答える 2

1

次の理由により、悪い結果が得られます。

  1. XML 名前空間を正しく処理していません。

  2. ノードの子としてではなくfields、ノードの子としてノードを作成しています。fxfdf

子ノードが追加されると、別の名前空間を明示的に指定しない限り、親ノードの名前空間を継承し、一度割り当てた名前空間を変更することはできません。

あなたの場合、xfdfノードは実際には Adob​​e 名前空間に追加されていません。あなたはそれを偽造しています! XML エンジンは名前空間を認識しないため、xfdfノードには空白の名前空間があり、f子ノードが継承します。これが、fノードが不要な属性で終わる理由xmlns=""であり、どのネームスペースの子ノードが属するかというあいまいさはありません。

名前空間を正しく宣言して XML エンジンが認識できるようにするには、プロパティIXMLNode.DeclareNamespace()を使用する代わりにメソッドを使用する必要がありIXMLNode.Attributesます。

次のいずれかを実行できます。

  1. xfdfドキュメントにノードを追加した後、ノードで Adob​​e 名前空間を明示的に宣言します。xfdfノード自体は名前空間にはありませんが (プロパティがまだ空白であることから明らかなように) IXMLNode.NamespaceURIfおよび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;
    
  2. xfdfまたは、そのノードをドキュメントに追加するときにそのノードで Adob​​e 名前空間を宣言すると、そのノードは名前空間に含まれるため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=""属性が削除され、後続の子ノードは期待どおりに名前空間を継承します。ffieldsxfdf

<?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>
于 2016-10-03T20:29:25.560 に答える