![](/img/trans.png)
[英]How to modify an inner property of a nested object in Javascript using a variable reference
[英]Reference/set nested XML object property using path in a string - JavaScript
这不适用于 web 开发。 我正在使用 ES3。
在这种情况下,如何使用 javascript 从 883812976388 元素proof
中获取信息? 我使用xml[xmlVariable]
查找proof
元素的方法不起作用 - 它不返回任何内容。 但是,当您在控制台中输入xml.ait.pages.proof
时(当程序在return
表达式处被断点保留时),它会从proof
元素正确返回"desired info"
。
我已经阅读了点/括号表示法,认为这将是解决方案,但不是。
这里的正确语法是什么?
<root>
<ait>
<pages>
<proof>desired info</proof>
</pages>
</ait>
</root>
var xmlFile = "C:\Users\user\Desktop\info.xml"
var xmlElementPath = "ait.pages.proof"
var info = readXMLVar(xmlElementPath, xmlFile)
function readXMLVar(xmlVariable, xmlFilePath) {
var file = new File(xmlFilePath)
file.open("r")
var content = file.read()
file.close()
var xml = new XML(content)
return xml[xmlVariable]
}
对于 XML,我可能会使用 XPath 进行查询。但是,您正在使用的代码似乎是从解析的 XML 中创建一个 object 结构,然后您想要使用它的路径来请求该结构的一部分,因为它是.
您可以在尝试时使用方括号表示法,但您必须一次在一个属性/节点级别执行此操作。 JS 不会解析您提供的点分隔路径以进入嵌套结构。
因此,您需要一些可以分解您想要的路径的东西,并逐个节点递归地沿着结构走下去。
这是一个基本的 function 可以遍历 object 结构:
var getNodeFromPath = function (data, path, separator) {
var node_name,
node,
ret;
if (!Array.isArray(path)) {
path = path.split(separator || '.');
}
node_name = path.shift();
node = data[node_name];
if (node === undefined) {
ret = null;
} else {
if (path.length) {
ret = getNodeFromPath(node, path);
} else {
ret = node;
}
}
return ret;
};
你可以这样称呼它:
var proof_element = getNodeFromPath(yourParsedXmlData, 'ait.pages.proof');
请注意,我给你的 function 中只有最小的控制权。 您可能希望添加一些检查以使其更能抵抗任意输入数据/路径问题。
对 JAAulde 的答案进行了修复,并进行了一些细微修改以适应我的 function。这是我获取和设置 XML 变量的代码。
.(Object.prototype.toString.call(path) === '[object Array]')
用于代替.Array.isArray(path)
因为我被迫使用 ES3。
function readXMLFile(xmlFilePath) {
var file = new File(xmlFilePath)
file.open("r")
var content = file.read()
file.close()
return [file, new XML(content)]
}
function getXMLVar(xmlFilePath, nodePath, separator) {
var xml = readXMLFile(xmlFilePath)[1]
// navigate xml to return target node info
var getNodeFromPath = function(data, path, separator) {
var node_name,
node,
ret
if(!(Object.prototype.toString.call(path) === '[object Array]')) {
path = path.split(separator || '.')
}
node_name = path.shift()
node = data[node_name]
if(node === undefined) {
ret = null
} else {
if(path.length) {
ret = getNodeFromPath(node, path, separator)
} else {
ret = node
}
}
return ret
}
return getNodeFromPath(xml, nodePath, separator)
}
function setXMLVar(xmlFilePath, nodePath, separator, value) {
var read = readXMLFile(xmlFilePath)
var file = read[0]
var xml = read[1]
setNodeFromPath = function(data, path, separator, value) {
var node_name,
node
if(!(Object.prototype.toString.call(path) === '[object Array]')) {
path = path.split(separator || '.')
}
node_name = path.shift()
node = data[node_name]
if(path.length > 1) {
setNodeFromPath(node, path, separator, value)
} else {
node[path[0]] = value
}
}
setNodeFromPath(xml, nodePath, separator, value)
file.open("w")
file.write(xml)
file.close()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.