使用 Google Apps 脚本在 XML 中设置命名空间前缀

Set Namespace prefix in XML using Google Apps Script

我正在尝试使用 Google Apps 脚本在 XML 文件中创建以下结构:

<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/">
  <fields>
    <field name="TestingXML">
      <value>Some Testing Value</value> 
    </field>
    <field name="Address_es_:prefill">
      <value>Client Address</value>
    </field>
    <field name="Address1_es_:prefill">
      <value>Project Address</value>
    </field>
  </fields>
</xfdf>

尝试设置命名空间前缀时出现问题:

xmlns="http://ns.adobe.com/xfdf/"

到目前为止,这是我的代码:

  var contractInfo = [
    ["Customer Name_es_:prefill","ownerFullName"],
    ["Address_es_:prefill", "clientAddress"],
    ["Address_Project_es_:prefill", "projectAddress"]
  ];

function CreateXML(contractInfo){
  //Define Namespace
  var nsh = XmlService.getNamespace('http://ns.adobe.com/xfdf/');

 //Create the root element and set the namespace
  var root = XmlService.createElement('xfdf', nsh);
  
  //Create the next section
  var fields = XmlService.createElement('fields');
  root.addContent(fields); //attach this section to the root
  
  //Loop and create the rest of sections based on an 2D array object.
  for(var m = 0; m < contractInfo.length; m++){

    var child1 = XmlService.createElement('field')
    .setAttribute('name', contractInfo[m][0]);
    
    var chiled2 = XmlService.createElement('value').setText(contractInfo[m][1]);
    child1.addContent(chiled2);
    fields.addContent(child1);
  }
  
  var document = XmlService.createDocument(root);
  //var xml = XmlService.getPrettyFormat().format(document);
  Logger.log(document);
}

但是,当 运行 这段代码时,我在 Logger.log

中遇到以下错误
[Document:  No DOCTYPE declaration, Root is [Element: <xfdf [Namespace: http://ns.adobe.com/xfdf/]/>]]

理想情况下输出 XML 应该是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/">
  <fields>
    <field name="TestingXML">
      <value>Some Testing Value</value> 
    </field>
    <field name="Address_es_:prefill">
      <value>Client Address</value>
    </field>
    <field name="Address1_es_:prefill">
      <value>Project Address</value>
    </field>
  </fields>
</xfdf>

我想我在开头漏掉了这一部分:

xml version="1.0" encoding="UTF-8"

但是,这是它自己创建的。我怎样才能绕过这个没有 DOCTYPE 声明?

我相信你的目标如下。

  • 您想使用 Google Apps 脚本创建以下 xml 数据。

    <?xml version="1.0" encoding="UTF-8"?>
    <xfdf xmlns="http://ns.adobe.com/xfdf/">
      <fields>
        <field name="TestingXML">
          <value>Some Testing Value</value>
        </field>
        <field name="Address_es_:prefill">
          <value>Client Address</value>
        </field>
        <field name="Address1_es_:prefill">
          <value>Project Address</value>
        </field>
      </fields>
    </xfdf>
    

为此,这个修改怎么样?在您的脚本中,为了检索结果 xml 数据,请使用 XmlService.getPrettyFormat().format(document)。而且,您的脚本中有几个修改点可以实现上述示例值。所以我也修改了它们。

修改后的脚本:

function CreateXML(contractInfo){

  // This is a sample value. Please modify this for your actual situation.
  var contractInfo = [
    ["TestingXML","Some Testing Value"],
    ["Address_es_:prefill", "Client Address"],
    ["Address1_es_:prefill", "Project Address"]
  ];

  var nsh = XmlService.getNamespace('http://ns.adobe.com/xfdf/');
  var root = XmlService.createElement('xfdf', nsh);
  var fields = XmlService.createElement('fields', nsh);  // Modified
  for(var m = 0; m < contractInfo.length; m++){
    var child1 = XmlService.createElement('field', nsh).setAttribute('name', contractInfo[m][0]);  // Modified
    var chiled2 = XmlService.createElement('value', nsh).setText(contractInfo[m][1]);  // Modified
    child1.addContent(chiled2);
    fields.addContent(child1);
  }
  root.addContent(fields);  // Added
  var document = XmlService.createDocument(root);
  var res = XmlService.getPrettyFormat().format(document);  // Added
  console.log(res);
}
  • 您的示例输出值与脚本中 contractInfo 的值不同。所以我用下面的contractInfo作为样本值

    var contractInfo = [
      ["TestingXML","Some Testing Value"],
      ["Address_es_:prefill", "Client Address"],
      ["Address1_es_:prefill", "Project Address"]
    ];
    
  • 当上述脚本为运行时,可得到如上节所示的示例输出值

参考文献: