【问题标题】:XML to JavaScript ObjectXML 到 JavaScript 对象
【发布时间】:2010-11-17 02:20:42
【问题描述】:

我正在寻找一个可以解析 XML 字符串并将其转换为 JavaScript 对象的 JavaScript 库。有哪些好的?

【问题讨论】:

    标签: javascript xml json


    【解决方案1】:

    以下函数解析 XML 并返回一个带有与 XML 对应的方案的 JavaScript 对象。具有相同名称的 XML 同级被折叠成数组。可以在arrayTags 参数(标签名称字符串数组)中找到名称的节点即使在仅出现一个标签的情况下也总是产生数组。 arrayTags 可以省略。丢弃只有空格的文本节点。

    function parseXml(xml, arrayTags) {
        let dom = null;
        if (window.DOMParser) dom = (new DOMParser()).parseFromString(xml, "text/xml");
        else if (window.ActiveXObject) {
            dom = new ActiveXObject('Microsoft.XMLDOM');
            dom.async = false;
            if (!dom.loadXML(xml)) throw dom.parseError.reason + " " + dom.parseError.srcText;
        }
        else throw new Error("cannot parse xml string!");
    
        function parseNode(xmlNode, result) {
            if (xmlNode.nodeName == "#text") {
                let v = xmlNode.nodeValue;
                if (v.trim()) result['#text'] = v;
                return;
            }
    
            let jsonNode = {},
                existing = result[xmlNode.nodeName];
            if (existing) {
                if (!Array.isArray(existing)) result[xmlNode.nodeName] = [existing, jsonNode];
                else result[xmlNode.nodeName].push(jsonNode);
            }
            else {
                if (arrayTags && arrayTags.indexOf(xmlNode.nodeName) != -1) result[xmlNode.nodeName] = [jsonNode];
                else result[xmlNode.nodeName] = jsonNode;
            }
    
            if (xmlNode.attributes) for (let attribute of xmlNode.attributes) jsonNode[attribute.nodeName] = attribute.nodeValue;
    
            for (let node of xmlNode.childNodes) parseNode(node, jsonNode);
        }
    
        let result = {};
        for (let node of dom.childNodes) parseNode(node, result);
    
        return result;
    }
    

    【讨论】:

    • 嗨,Maylow,欢迎来到 SO,如果您能提供一个简短的描述以及您的答案,将会更有帮助,
    • 这非常有帮助。做得好,谢谢。
    • 也看看我那里的改进
    • @MaylowHayes 这在 IE11 中使用时会产生脚本错误。有什么想法吗?
    • 文本节点对于每个节点都是空的 :(
    【解决方案2】:

    【讨论】:

    • Goessner 库的问题在于它返回一个 JSON 字符串。您最终会将 XML 字符串转换为 JSON 字符串,然后您必须 再次解析 以获取实际的 Javascript 对象。它会起作用,但可能有更有效的方法。
    【解决方案3】:

    直奔主题(使用node-xml2json):

    npm install xml2json
    

    然后,使用它:

    const parser = require('xml2json');
    
    const obj = parser.toJson(xml, { object: true });
    

    示例:

    const parser = require('xml2json');
    
    const xml = '<root><person><name>Bob Dylan</name></person></root>';
    
    const obj = parser.toJson(xml, { object: true });
    const { person } = obj.root;
    person.name; // Bob Dylan
    

    您还可以从 JSON 转换为 XML,以及 much more

    【讨论】:

      【解决方案4】:

      我想要一个简单的 Typescript 版本,它不会创建额外的 #text 对象,也不会忽略属性。如果这是你需要的,这里是代码:

      export class DomFuncs {
      
          static parseNode = (node: Node) => {    
              const childNodes = node.childNodes;
              if (childNodes.length === 0) {
                  return node.nodeValue;
              } else if (childNodes.length === 1 && childNodes[0].nodeType === Node.TEXT_NODE) {
                  return childNodes[0].nodeValue;
              } else {
                  const obj = {};
                  childNodes.forEach(childNode => {
                      const childName = childNode.nodeName;
                      const childValue = obj[childName];
                      if (childValue !== undefined) {
                          if (Array.isArray(childValue)) {
                              childValue.push(DomFuncs.parseNode(childNode));
                          } else {
                              obj[childName] = [childValue, DomFuncs.parseNode(childNode)];
                          }
                      } else {
                          obj[childName] = DomFuncs.parseNode(childNode);
                      }
                  });
                  return obj;
              }
          };
      
          static xml2obj = (str: string) => {
              const dom = (new DOMParser()).parseFromString(str, 'text/xml')
              const result = {[dom.nodeName]: DomFuncs.parseNode(dom)};
              return result;
          }
      }
      

      使用它:

      DomFuncs.xml2obj(xmlString);
      

      此脚本当前忽略 XML 属性,因为我转换的对象不需要它们。如果您需要,请告诉我,我可以更新代码。

      【讨论】:

        【解决方案5】:

        来自https://bitbucket.org/surenrao/xml2json 的 xml2json javascript 文件就是您执行此操作所需的全部内容。

        这里是快速下载的下载链接:https://bitbucket.org/surenrao/xml2json/get/0e0989dfe48e.zip

        一旦包含在您的项目中,这里有一些示例代码可以帮助您入门:

        var xmlStr = "<root><person><name>Bob Dylan</name></person></root>";
        var jsObj = X2J.parseXml(xmlStr);
        var result = jsObj[0].root[0].person[0].name[0].jValue; //Bob Dylan
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-24
          • 2012-09-12
          相关资源
          最近更新 更多