如何在IE和firefox中解析javascript中的XML?

如何在IE和firefox中解析javascript中的XML?,javascript,xml,Javascript,Xml,我正试图编写一段代码来解析IE和firefox中的javascript 以下内容在IE中工作,在firefox中毫无怨言 function XmlDom(sXml){ var oXml; if (window.ActiveXObject) { // ie oXml = new ActiveXObject("Microsoft.XMLDOM"); oXml.resolveExternals = false; oXml.

我正试图编写一段代码来解析IE和firefox中的javascript

以下内容在IE中工作,在firefox中毫无怨言

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下会出现错误(因为childNodes不存在)

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

        }
    }
}
我坚信这两种方法都应该有效。但有些地方出了问题。我想要一只手

<?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>

8.
AIS门
假的
82
朋友
假的

问题在于Firefox的XML解析器没有忽略空白文本节点,而IE则忽略空白文本节点,这意味着
oXml.lastChild.lastChild
实际上是一个文本节点,没有子节点。据我所知,Firefox(和其他浏览器)中的
DOMParser
无法指示忽略空白节点,因此您必须通过以下两种方法之一解决此问题:要么在将空白传递给解析器的
parseFromString()
方法之前删除空白,或者以过滤掉空白文本节点的方式遍历XMLDOM

Firefox 3.5及更高版本支持,这意味着您可以使用诸如
firstElementChild
lastElementChild
nextElementSibling
previousElementSibling
等属性。Firefox 3.5还支持元素的属性,该属性是作为元素的所有子节点的集合。Safari、Chrome和Opera的最新版本(我不确定具体细节)也支持这些属性

最后一个选项是在遍历DOM之前手动删除所有空白节点,该选项使用标准的DOM级别1方法,因此适用于所有浏览器。以下函数将递归执行此操作:

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

嗯,在那里试验最后的选择。但实际上并没有找到任何要删除的节点。(也就是说,它永远不会进入if)对我来说是完美的:
var-oXml=XmlDom(sourceXML);removeWhiteSpaceNodes(oXml)
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;
    }
}