我在InDesign中导入了一些XML文件(您可以在下图中看到结构),我还创建了一个脚本来获取有关此层次结构的一些统计信息。
例如,要计算“免费”元素:
var items = app.activeDocument.xmlElements.everyItem();
var items1 = items.xmlElements.itemByName("cars");
var cars = items1.xmlElements.everyItem();
var c_free = cars.xmlElements.itemByName("free");
var cars_free = c_free.xmlElements.count().length;
上面的代码会在我的结构中返回正确数量的免费汽车。
我正在尝试做的事情 - 到目前为止没有任何运气 - 是针对那些免费物品(车内)并删除所有物品或特定号码。
我的最后一次尝试是使用:
var del1 = myInputGroup2.add ("button", undefined, "Delete All");
del1.onClick = function () {
cars.xmlElements.everyItem().remove();
}
在我创建的对话框中。
任何建议都会受到赞赏,因为我真的被困在这里。
答案 0 :(得分:1)
我可能会使用XPath。您可以使用evaluateXPathExpression创建要定位的元素数组。假设你的根元素是汽车并且它包含名为cars1的元素,并且你想删除cars1元素中的所有自由元素,你可以这样做:
var myDoc = app.activeDocument;
//xmlElements[0] is your root element, in this case "cars". The xPath expression is evaluated from cars.
//evaluateXPathExpression returns an array of all of the free elements that are children of cars.
var myFrees = myDoc.xmlElements[0].evaluateXPathExpression("cars1/free");
for (var i = myFrees.length - 1; i>=0; i--){
myFrees[i].remove();
}
调整这个需要一些xPath的知识,但是学习基础知识并不是非常困难,它看起来似乎是最简单的方法。
答案 1 :(得分:1)
我认为你的主要问题是XMLElements没有itemByName方法。您只能通过其indeces或id引用XMLElements。
其次你假设你从XPath表达式获得了xmlElements,但是由于你的xpath看起来不正确,你很可能没有得到任何东西。
var myFrees = myDoc.xmlElements[0].evaluateXPathExpression("./cars1/free");
var n = myFrees.length;
if ( !n ) {
alert("Aucun élément trouvé");
}
else {
while (n--) myFrees[n].remove();
}
您需要通过设置xpath的原点来启动表达式。这里有一个点“./”用于告诉您想要在xmlelement的“根”处查找cars1 / free xml元素。相反,使用“//”会返回任何汽车/免费物品,无论其位置如何。