Tool: ServiceNow.语言: JavaScript
我的方法:我在每个级别使用 while 循环进行迭代以达到">TestBS4"的sys_id,一旦我在标签内拥有第一个<CI>...</CI>
节点,我必须将 4 个循环一个放在另一个内部<childrenOfCurrentCI>
而循环。我觉得这可以通过递归来完成,但我做不到。
如果我有 50 个 CI 孩子一个在另一个(不是兄弟姐妹(,我需要第 45 个怎么办?我很感激有人帮助使用递归来实现这一点。 sys_id可以放在数组中以供进一步处理。
在这种情况下,我需要所有sys_id,直到<childrenOfCurrentCI>
标签的每个子级的第 4 级 (TestBS4(。
下面是示例 XML。
<?xml version="1.0" encoding="UTF-8"?>
<xmlTree>
<sys_id>e9c23f4adbf31300ae2af28239961974</sys_id>
<name>Test CI One</name>
<relType>SELF</relType>
<childrenOfCurrentCI>
<CI>
<sys_id>68b1b746dbf31300ae2af2823996197a</sys_id>
<name>TestBS1</name>
<relType>Depends on::Used by</relType>
<children>
<CI>
<sys_id>964477cedbf31300ae2af28239961913</sys_id>
<name>TestBS2</name>
<relType>Depends on::Used by</relType>
<children>
<CI>
<sys_id>88643fcedbf31300ae2af2823996190b</sys_id>
<name>TestBS3</name>
<relType>Depends on::Used by</relType>
<children>
<CI>
<sys_id>0264f7cedbf31300ae2af28239961971</sys_id>
<name>TestBS4</name>
<relType>Depends on::Used by</relType>
<children>
<CI>
<sys_id>fb64ffcedbf31300ae2af282399619e8</sys_id>
<name>TestBS5</name>
<relType>Depends on::Used by</relType>
</CI>
</children>
</CI>
</children>
</CI>
</children>
</CI>
</children>
</CI>
<CI>
<sys_id>ae1ff02fdbfb1300ae2af2823996195d</sys_id>
<name>Test Side Parent One</name>
<relType>Depends on::Used by</relType>
</CI>
</childrenOfCurrentCI>
</xmlTree>
刚刚针对案例进行编码
在这种情况下,我需要所有sys_id直到第 4 级 (TestBS4( 标签的每个子项。
希望你明白这个想法。
var text = `
<xmlTree>
<sys_id>e9c23f4adbf31300ae2af28239961974</sys_id>
<name>Test CI One</name>
<relType>SELF</relType>
<childrenOfCurrentCI>
<CI>
<sys_id>68b1b746dbf31300ae2af2823996197a</sys_id>
<name>TestBS1</name>
<relType>Depends on::Used by</relType>
<children>
<CI>
<sys_id>964477cedbf31300ae2af28239961913</sys_id>
<name>TestBS2</name>
<relType>Depends on::Used by</relType>
<children>
<CI>
<sys_id>88643fcedbf31300ae2af2823996190b</sys_id>
<name>TestBS3</name>
<relType>Depends on::Used by</relType>
<children>
<CI>
<sys_id>0264f7cedbf31300ae2af28239961971</sys_id>
<name>TestBS4</name>
<relType>Depends on::Used by</relType>
<children>
<CI>
<sys_id>fb64ffcedbf31300ae2af282399619e8</sys_id>
<name>TestBS5</name>
<relType>Depends on::Used by</relType>
</CI>
</children>
</CI>
</children>
</CI>
</children>
</CI>
</children>
</CI>
<CI>
<sys_id>ae1ff02fdbfb1300ae2af2823996195d</sys_id>
<name>Test Side Parent One</name>
<relType>Depends on::Used by</relType>
</CI>
</childrenOfCurrentCI>
</xmlTree>
`;
if (window.DOMParser)
{
parser = new DOMParser();
xmlDoc = parser.parseFromString(text, "text/xml");
}
else // Internet Explorer
{
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.loadXML(text);
}
let sysIds = xmlDoc.getElementsByTagName("childrenOfCurrentCI")[0].getElementsByTagName("sys_id");
function getMeSysId(position) {
console.log(sysIds[position-1].textContent);
}
console.log("to get the 4th level sys_Id");
getMeSysId(4);
console.log("for all the sysid's inside childrenOfCurrentCI");
for (let i=0; i<sysIds.length;i++) {
console.log(sysIds[i].textContent);
}
使用var
而不是let
否则可以跳过条件(IE版本需要( 并尝试使用 serviceNow xml dom parser
所以更新的代码块是
xmlDoc = new XMLDocument(text);
var sysIds = xmlDoc.getElementsByTagName("childrenOfCurrentCI")[0].getElementsByTagName("sys_id");
如果你想从XML中按名称检索CI的sys_id,我建议使用XPath,它是XML操作的。ServiceNowXMLDocument2
对象将帮助您解析 XML。这是您的案例的示例代码
var xmlString = 'YOUR_XML';
var ciName = 'TestBS4';
var xPath = "//CI/name[text() = '" + ciName + "']/../sys_id/text()";
var xmlDoc = new XMLDocument2();
xmlDoc.parseXML(xmlString);
var sysID = xmlDoc.getNode(xPath).toString();
gs.log(sysID);
getNode
方法中使用的 XPath 在 XML 中查找值为ciName
变量CI/name
节点。然后向上一个节点来检索sys_id
节点的值。