2011-01-17 2 views
1

У меня возникают проблемы со специальными символами, которые существуют в атрибуте узла xml. Чтобы бороться с этим, я пытаюсь отобразить атрибуты в качестве дочерних узлов и, при необходимости, использовать разделы cdata, чтобы обойти специальные символы. Проблема в том, что, похоже, я не могу правильно добавить раздел cdata, прикрепленный к узлу.Javascript, чтобы добавить раздел cdata на лету?

Я выполняю итерации по атрибутам исходного XML-узла и созданию новых узлов. Если attribute.name = "description", я хочу поместить атрибут.text() в раздел cdata и добавить новый узел. Вот где я прыгаю по трассе.

 // newXMLData is the new xml document that I've created in memory 
    for (var ctr =0;ctr< this.attributes.length;ctr++){ // iterate over the attributes 
      if(this.attributes[ctr].name =="Description"){ // if the attribute name is "Description" add a CDATA section 
      var thisNodeName = this.attributes[ctr].name; 
       newXMLDataNode.append("<"+thisNodeName +"></"+ thisNodeName +">"); 
       var cdata = newXMLData.createCDATASection('test'); // here's where it breaks. 
      } else { 
      // It's not "Description" so just append the new node. 
      newXMLDataNode.append("<"+ this.attributes[ctr].name +">" + $(this.attributes[ctr]).text() + "</"+ this.attributes[ctr].name +">" ); 
      }   
     } 

Любые идеи? Есть ли другой способ добавить раздел cdata?

Вот пример отрывок из источника ...

<row 
pSiteID="4" 
pSiteTile="Test Site Name " 
pSiteURL="http://www.cnn.com" 
ID="1" 
Description="<div>blah blah blah since June 2007.&amp;nbsp; T<br>&amp;nbsp;<br>blah blah blah blah&amp;nbsp; </div>" 
CreatedDate="2010-09-20 14:46:18" 
Comments="Comments example.&#10;" > 

вот что я пытаюсь создать ...

<Site> 
<PSITEID>4</PSITEID> 
<PSITETILE>Test Site Name</PSITETILE> 
<PSITEURL>http://www.cnn.com</PSITEURL> 
<ID>1</ID> 
<DESCRIPTION><![CDATA[<div>blah blah blah since June 2007.&amp;nbsp; T<br>&amp;nbsp;<br>blah blah blah blah&amp;nbsp; </div ]]></DESCRIPTION> 
<CREATEDDATE>2010-09-20 14:46:18</CREATEDDATE> 
<COMMENTS><![CDATA[ Comments example.&#10;]]></COMMENTS> 
</Site> 
+1

Можете ли вы показать некоторые XML до и после добавления CDATA? – tj111

+0

Если ваш XML не является корректным, тогда у вас есть две проблемы. – drudge

+0

Это не помогает. Я пытаюсь создать хорошо сформированный xml из не очень хорошо сформированного xml. Следовательно, CDATA. –

ответ

0

Не уверен, что поддержка браузера для document.implementation.createDocument или createCDataSection, но это работает в Mozilla как минимум:

<script> 

    // Define some helpers (not available IE < 9) 
    function parse (str) { 
     return new DOMParser().parseFromString(str, 'text/xml').documentElement; 
    } 
    function ser (dom) { 
     return new XMLSerializer().serializeToString(dom); 
    } 

    // Simulate your XML retrieval 
    var row = '<row pSiteID="4" pSiteTile="Test Site Name " pSiteURL="http://www.cnn.com" ID="1" Description="<div>blah blah blah since June 2007.&amp;nbsp; T<br>&amp;nbsp;<br>blah blah blah blah&amp;nbsp; </div>" CreatedDate="2010-09-20 14:46:18" Comments="Comments example.&#10;" />'; 

    // Hack to convert source to well-formed XML, or otherwise you can't use DOM methods on it which 
    // depend on well-formed XML 
    row = row.replace(/(=\s*")([\s\S]*?)(")/g, function (n0, n1, n2, n3) { 
     return n1+ // Add back equal sign and opening quote 
      n2.replace(/</g, '&lt;'). // Create well-formed XML by avoiding less-than signs inside attributes 
      replace(/&amp;nbsp;/g, '&amp;#160;')+ // HTML entities (except for gt, lt, amp, quot) must be either converted to numeric character references or your XML must define the same entities 
      n3; // Add back closing quote 
    }); 

    // Simulate your retrieval of DOM attributes, though in this context, we're just making attributes into a global 
    this.attributes = parse(row).attributes; 

    // Simulate your creation of an XML document 
    var newXMLData = document.implementation.createDocument(null, 'Site', null); 

    // Modify your code to avoid jQuery dependency for easier testing and to 
    // avoid confusion (error?) of having two variables, newXMLData and newXMLDataNode 
    for (var ctr =0;ctr< this.attributes.length;ctr++){ // iterate over the attributes 
     if (this.attributes[ctr].name =="Description") { // if the attribute name is "Description" add a CDATA section 
     var thisNodeName = this.attributes[ctr].name; 
     var str = "<"+thisNodeName +"></"+ thisNodeName +">"; 
     var node = parse(str); 
     var cdata = newXMLData.createCDATASection(this.attributes[ctr].textContent); 
     node.appendChild(cdata); 
     newXMLData.documentElement.appendChild(node);  
     } 
     else { 
     // It's not "Description" so just append the new node. 
     var str= "<"+ this.attributes[ctr].name +">" + this.attributes[ctr].textContent + "</"+ this.attributes[ctr].name +">"; 
     newXMLData.documentElement.appendChild(parse(str)); 
     } 
    } 
    // Prove its working (though you may wish to use toUpperCase() if you need the element names upper-cased); 
    // if you need CDATA for Comments, you can follow the pattern above to add support for that too 
    alert(ser(newXMLData)); 
</script> 
2

У меня была та же проблема. я пытался добавить CDATA в XML-узлов, так что я думал, что его так же просто, как добавление примерно так:

valueNode[0].text = "<![CDATA["+ tmpVal +"]]>"; 
//valueNode[0] represents "<value></value>" 

Это не работает, потому что все это будет трактовались как текст поэтому < (меньше) и> (отлично) будут автоматически заменены.

то, что вам нужно сделать, это использовать createCDATASection, выполнив следующие действия:

var tmpCdata = $xmlDoc[0].createCDATASection(escape("muzi test 002")); 
//i'm also escaping special charactures as well 
valueNode[0].appendChild(tmpCdata); 

результаты будут:

<value><![CDATA[muzi%20test%20002]]></value> 

Brettz9 (в предыдущем ответе) объясняет, как это сделать, но довольно сложным, поэтому я просто хотел добавить свое решение, которое намного проще.

спасибо,

Смежные вопросы