2016-11-07 35 views

回答

-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; 
} 
+1

這並不完全可靠。它將錯誤地從'去掉空格 - >',並且不會刪除編碼爲實體的空白(如果需要的話)。 – JLRishe

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

+0

非常感謝JLRishe,你的代碼片段完美地工作,你的方法已經足夠。 –