getElementById for XML Documents, Mozilla extensions

[亡魂溺海] 提交于 2019-12-07 15:05:22

问题


Is document.getElementById method supported on DOM parsed from XML strings using the DOMParser method in Mozilla? I am making a Mozilla extension that reads an XML file and uses DOM Parser to convert the XML into a DOM element and tries getting elements by Id. The method getElementsByTagName works but not getElementById. It always returns null.

function (xmlString) {
    var parser = new DOMParser();
    var doc = parser.parseFromString(xmlString, "text/xml"); 
    var aNodes = doc.getElementsByTagName("nodeTag");
    for(var i=0; i<aNodes.length; ++i) {
        var id = aNodes[i].getAttribute('id');
        var resultNode = doc.getElementById(id);
        alert(id);
        alert(resultNode);
    }
}

I tried the above code. alert(id) returns the proper id, whereas alert(resultNode) returns null every time.


回答1:


No, document.getElementById doesn't generally work on arbitrary XML documents.

In recent browsers (e.g. Firefox 3.5 and later), you can use document.querySelector instead:

var resultNode = doc.querySelector("[id=" + id + "]");



回答2:


If you would like a solution that actually makes the getElementById() method usable (which you should, It is much much faster, and more versatile) and you have access to the DTD add the following line to it:

<!ATTLIST client id ID #IMPLIED >

If you aren't using a DTD yet, just add this to the xml document directly after the <?xml version= \"1.0\"?> statement:

<!DOCTYPE clients [ 
   <!ATTLIST client id ID #IMPLIED > 
]>

In this example "clients" is the root of my xml file, and "client" is the element i would like to attach id's to. You can add multiple "ATTLIST" statements for other elements you would like to add id's to other types of elements.

I tested this in safari, chrome, and firefox. works perfectly.



来源:https://stackoverflow.com/questions/3667388/getelementbyid-for-xml-documents-mozilla-extensions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!