繁体   English   中英

使用字符串中的路径引用/设置嵌套 XML object 属性 - JavaScript

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM