Это не для веб-разработки. Я использую ES3.

Как мне получить информацию из xml-элемента proof с помощью javascript в этом сценарии? Мой способ поиска элемента proof с xml[xmlVariable] не работает - он ничего не возвращает. Но когда вы вводите xml.ait.pages.proof в консоли (пока программа удерживается точкой останова в выражении return), она правильно возвращает "desired info" из элемента proof.

Я читал о нотации точек / скобок, думая, что это было бы решением, но нет.

Какой правильный синтаксис здесь?

<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]
}
0
AJUK 31 Авг 2020 в 23:28

2 ответа

Лучший ответ

Применил исправления к ответу JAAulde и некоторые незначительные изменения, чтобы соответствовать моей функции. Вот мой код, позволяющий < sizes и устанавливать переменные 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()
}
0
AJUK 2 Сен 2020 в 13:19

Для XML я, вероятно, запросил бы с помощью XPath. Однако код, который вы используете, похоже, создает структуру объекта из проанализированного XML, и затем вы хотите запросить часть этой структуры, используя как бы путь к ней.

Вы можете использовать обозначение квадратных скобок, как вы пытались, но вы должны делать это на уровне свойства / узла за раз. JS не анализирует путь, разделенный точками, который вы указали для перехода во вложенную структуру.

Таким образом, вам нужно что-то, что может разбить нужный вам путь и рекурсивно пройти по узлу структуры.

Вот базовая функция, которая может обходить структуру объекта:

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');

Обратите внимание, что функция, которую я вам дал, имеет минимальный контроль. Возможно, вы захотите добавить некоторые проверки, чтобы сделать его более устойчивым к проблемам с произвольными входными данными / путями.

0
JAAulde 1 Сен 2020 в 20:46