如何从XML文件填充JavaScript变量?

z9gpfhce  于 2023-05-21  发布在  Java
关注(0)|答案(2)|浏览(143)

我正在使用XML数据填充InDesign模板的自动发布流程。将XML文件添加到监视文件夹时将触发工作流。
为了确定要使用的正确InDesign模板,我需要将一些关键数据点拉入InDesign执行的JavaScript中。
例如,如果XML文件开头的元素包含“CO”(表示科罗拉多),我希望top将JS区域变量设置为“CO”,然后使用该变量来确定数据的发送位置。
已编辑:使用实际XML更新
如果XML看起来像:

<Root xmlns="kpPDCommon" xmlns:kpdc="kpPDCommon">
    <region kpdc:regionCD="CO">CO</region>
    <lob kpdc:lobCD="MCAR">Medicare</lob>
    <serviceArea kpdc:saCD="DB">Denver Metropolitan Service Area</serviceArea>
    <saPlans>
        <planName>Senior Advantage (HMO)</planName>
        <planName>Senior Advantage Medicare Medicaid (HMO D-SNP)</planName>
        <planName>Senior Advantage (HMO-POS)</planName>
    </saPlans>
...

我想在我的JS文件中使用它:

var RGN = region;
var VER = version;

然后,这些变量用于选择要将XML导入的适当InDesign模板。
我是JavaScript新手,希望得到尽可能多的指导。
但是,请注意,有问题的脚本必须是由Adobe InDesign运行的JSX脚本。它不会在浏览器中运行。InDesign是一个完全可编写脚本的应用程序,它可以在启动时运行JSX脚本,也可以在从脚本面板运行时按需运行。此脚本将用作InDesign中自动发布工作流的一部分。
我查看了以下选项,但无法找到解决方案:

  1. https://bytes.com/topic/xml/answers/694987-passing-xml-element-data-javascript-asp-va,我需要填充InDesign的JS变量,而xsl无法完成我的任务
  2. https://medium.com/frontendweb/how-to-read-local-json-file-in-react-js-564125235fc7,我正在处理大型数据文件,只想从文件的开头提取变量数据。
  3. https://www.youtube.com/watch?v=lUCQgqc4K2A,与#2相同,同样,我需要加载LOCAL XML文件。
  4. https://50linesofco.de/post/2019-07-05-reading-local-files-with-javascript,同样,我正在处理非常大的、深度嵌套的数据文件。
    我还尝试了以下方法:
import("C:/Users/O146962/OneDrive - Kaiser Permanente/Desktop/Indesign Automation POC/Data/CO_DNB_Providers_Test_BR4.xml").then(response => {
    return response.text();
}).then(xmlString => {
 const xmlDocument = new DOMParser().parseFromString(xmlString, "text/xml");
 const region = xmlDocument.querySelectorAll("region");
 for (const region of region) {
    const code = region.textContent;
 }
 console.log();
});

但到目前为止,这也没有工作,因为它不会加载本地文件。
需要说明的是,我不想加载或导入整个xml文件!我想引入一些在文档开头定义的变量。

qxgroojn

qxgroojn1#

Loic.Aigon在Adobe论坛中提供的答案:使用名称空间解析XML
似乎为了让它正常工作,需要声明文件编码。

var f = File (Folder.desktop+"/test.xml");
f.encoding ="UTF-8";
f.open("r");
var x = XML(f.read());
f.close();
alert(x.xpath("//kpdc:serviceArea"));
bxfogqkk

bxfogqkk2#

可能是这样的:

var folder = Folder('/Users/me/test');
var file = File(folder + '/test.xml');

file.open('r');
var xml = new XML(file.read());
file.close();

var RGN = xml.region.text();
var VER = xml.version.text();

alert('RGN: ' + RGN + ', VER: ' + VER);

结果:

更新

以下是正确的方法:
XML文件:

<?xml-model href="../CO-Medicare_Combined-Structure.xsd"?>
<!DOCTYPE Root [
  <!ENTITY path "file:///C:/Users/O146962/OneDrive - Kaiser Permanente/Desktop/Indesign Automation POC/Assets/Icons/">
]>
<Root xmlns="kpPDCommon" xmlns:kpdc="kpPDCommon">
  <region kpdc:regionCD="CO">CO</region>
  <lob kpdc:lobCD="MCAR">Medicare</lob>
  <serviceArea>Denver Boulder</serviceArea>
  <planName>Senior Advantage Medicare Medicaid</planName>
</Root>

验证码:

var dataPath = Folder("/Users/.../");
var file = File(dataPath + "/test.xml");

var ns = new Namespace ("kpPDCommon");

file.open("r");
var xml = new XML(file.read());
file.close();

var RGN = xml.ns::region;
var LOB = xml.ns::lob;
var SVCA = xml.ns::serviceArea;
var SVCA_PN = xml.ns::planName;

alert("RGN: " + RGN + ", LOB: " + LOB + ", SVCA_PN: " + SVCA_PN);

结果:

相关问题