2010-11-24 15 views
2

私はIEとFirefoxの両方でjavascriptを解析するコードを1つ作成しています。IEとFirefoxの両方でjavascriptでXMLを解析するにはどうすればよいですか?

function XmlDom(sXml){ 
    var oXml; 
    if (window.ActiveXObject) { 
     // ie 
     oXml = new ActiveXObject("Microsoft.XMLDOM"); 
     oXml.resolveExternals = false; 
     oXml.async = false; 
     oXml.loadXML(sXml); 
    } 
    else if (window.DOMParser){ 

     var parser = new DOMParser(); 
     oXml = parser.parseFromString(sXml, "text/xml"); 

    } 
return oXml 
} 

IEで、次の作品は、しかし、使用のFirefox

var oXml = XmlDom(sourceXML); 
var listHtml = ""; 
if (oXml.firstChild != null) { 
    var childNodes = null; 
    try { 
     childNodes = oXml.lastChild.lastChild.firstChild.childNodes; 
    } 
    if (childNodes != null && childNodes.length > 0) { 

     for (var i = 0; i < childNodes.length; i++) { 

      var vehicleName = NodeText(SelectSingleNode(childNodes[i], 'VehicleName', 'VehicleName')); 
      var vehicleId = NodeText(SelectSingleNode(childNodes[i], 'VehicleId', 'VehicleId')); 

     } 
    } 
} 

下(のchildNodesが存在しないため)エラーが発生しますFirefoxで文句なしに、次のIEで動作し、機能がjqueryは私にfirefoxの下で正しい動作を与えますが、IEではうまく動作しません(正しい番号の車両を見つけますが、それぞれがnullのIDと名前を持っています)

$(sourceXml).find("Table1").each(function() { 
     var vehicleId = $(this).find("VehicleId").text(); 
     var vehicleName = $(this).find("VehicleName").text(); 
    }); 

私はしっかりと両方のこれらのアプローチは、する必要がありますと確信しています。しかし何かが間違っている。私は手が大好きです。

<?xml version="1.0" encoding="utf-16"?> 
<DataSet> 
    <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"  xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop"> 
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
     <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
      <xs:element name="Table1"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="VehicleId" msprop:metadatacolumnname="VehicleId" msprop:caption="VehicleId" type="xs:string" minOccurs="0" /> 
       <xs:element name="VehicleName" msprop:metadatacolumnname="VehicleName" msprop:caption="VehicleName" type="xs:string" minOccurs="0" /> 
      <xs:element name="SendAlarms" msprop:metadatacolumnname="SendAlarms" msprop:caption="SendAlarms" type="xs:string" minOccurs="0" /> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:choice> 
    </xs:complexType> 
    </xs:element> 
    </xs:schema> 
    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
<NewDataSet> 
    <Table1 diffgr:id="Table11" msdata:rowOrder="0" diffgr:hasChanges="inserted"> 
    <VehicleId>8</VehicleId> 
    <VehicleName>AIS Gate</VehicleName> 
    <SendAlarms>False</SendAlarms> 
    </Table1> 
    <Table1 diffgr:id="Table12" msdata:rowOrder="1" diffgr:hasChanges="inserted"> 
    <VehicleId>82</VehicleId> 
    <VehicleName>Amigos</VehicleName> 
    <SendAlarms>False</SendAlarms> 
    </Table1> 
</NewDataSet> 
</diffgr:diffgram> 
</DataSet> 
+0

XMLはどのように見えますか? –

+0

上記のXMLが追加されました。 – Erin

答えて

8

問題はIEのはoXml.lastChild.lastChildが実際にテキストノードであり、子を持たないことを意味しているのに対し、FirefoxのXMLパーサは空白テキストノードを無視していないことです。空白ノードを無視するようにFirefox(と他のブラウザ)にあるDOMParserに指示する方法がないので、2つの方法のいずれかでそれを丸める必要があります:空白をパーザのparseFromString()メソッドに渡す前に空白を削除するか、空白文字のテキストノードをフィルタリングするような方法でXML DOMをトラバースします。

のFirefox 3.5以降DOM Element Traversal APIをサポートし、あなたがfirstElementChildlastElementChildnextElementSiblingpreviousElementSiblingのようなプロパティを使用することができることを意味し。 Firefox 3.5では、要素のすべての子ノードのコレクションである要素のchildrenプロパティもサポートされています。 Safari、Chrome、Operaの最近のバージョン(詳細はわかりません)でもこれらのプロパティをサポートしています。

標準DOMレベル1メソッドを使用し、すべてのブラウザで機能する最後のオプションは、DOMをトラバースする前にすべての空白ノードを手動で削除することです。次の関数はこれを再帰的に行います:

function removeWhiteSpaceNodes(node) { 
    var child = node.firstChild, nextChild; 
    while (child) { 
     nextChild = child.nextSibling; 
     if (child.nodeType == 3 && /^\s*$/.test(child.nodeValue)) { 
      node.removeChild(child); 
     } else if (child.hasChildNodes()) { 
      removeWhiteSpaceNodes(child); 
     } 
     child = nextChild; 
    } 
} 
+0

Hmm。そこで最後のオプションを試してみてください。しかし、実際には削除するノードが見つかっていません。 (すなわち、それは決してifに入りません) – Erin

+0

私にとって完璧に動作します: 'var oXml = XmlDom(sourceXML); removeWhiteSpaceNodes(oXml); ' –

関連する問題