在javascript中线性化或不需要XML

时间:2016-11-07 09:51:04

标签: javascript xml indentation

我想知道如何使用Javascript对XML文本进行线性化或取消。

这篇文章Unindent or linearize XML描述了如何使用Java,但我没有看到使用JavaScript的例子。

2 个答案:

答案 0 :(得分:1)

正如我在你的回答评论中指出的那样,正则表达式不是一种可行的方法。一种更可靠的方法是解析XML,删除所有空白的文本节点,然后重新序列化它:

function parseXml(txt) {
  var parser, xmlDoc;

  if (window.DOMParser) {
    parser = new DOMParser();
    xmlDoc = parser.parseFromString(txt, "text/xml");
  } else // Internet Explorer
  {
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async = false;
    xmlDoc.loadXML(txt);
  }

  return xmlDoc;
}

function serializeXml(node) {
  try {
    // XMLSerializer exists in certain browsers
    var serializer = new XMLSerializer();
    return serializer.serializeToString(node);
  } catch (e) {
    // Internet Explorer has a different approach to serializing XML
    return elem.xml;
  }

}

function removeWhitespace(node) {
  if (node.childNodes && node.childNodes.length) {
    Array.prototype.slice.call(node.childNodes).forEach(removeWhitespace);
  }
  if ((node.nodeType === 3 || node.nodeType === 4) && 
      /^[ \r\n\t]*$/.test(node.textContent)) {
    node.parentNode.removeChild(node);
  }
}

var startXml = '<products>\n\t<product>\n\t\t<code>1234</code>\n\t\t<name>Widget 3000</name>\n\t</product>\n</products>'

console.log('Before:');
console.log(startXml);

var dom = parseXml(startXml);

removeWhitespace(dom);

var endXml = serializeXml(dom);

console.log('After:');
console.log(endXml);

答案 1 :(得分:-1)

正如tebs1200建议的那样,我将正则表达式从Java帖子移植(甚至改进)到Javascript。

这是:

// This Javascript function is to linearize and return the XML input String
function linearize(xml) {
return (xml!= null) ? xml.trim().replace(/(>|&gt;){1,1}( |\t|\n|\r|\s)*(<|&lt;){1,1}/g, "$1$4") : null;
}