从GWT代码调用getElementsByTagNameNS

问题描述:

我有一个com.google.gwt.xml.client.Document对象形式的XML文档。由于在Document类中没有提供'getElementsByTagNameNS'API,是否可以使用一些本地Javascript函数来实现相同?从GWT代码调用getElementsByTagNameNS

该API应该采取两个参数 1 - 命名空间前缀。 2 - XML标签名称。

我需要这个,因为如果XML标签有一个命名空间前缀,则最近的Chrome更新(v60)不会返回DocumentList.getElementsByTagName(“book”)的NodeList。

c.g.g.xml从来不支持名称空间,因此不能用于使用XML名称空间的文档。它也包装本地对象,并且不给它们任何访问权限。现在,我想在API的浏览器支持方面几乎没有区别(例如IE6不是这种情况),所以你最好重写你的代码来使用JsInterop而不是cggxml(看一看在元素2,应该已经有映射)

我已经实现了一个快速和脏的替代getElementsByTagName函数。它采用完全限定的标记名称并返回所有具有确切标记名称的后代元素节点。

/** 
* Builds a list of the descendant elements with the supplied tag name from the {@code parent} node. The result 
* nodes are ordered by a depth-first traversal of the element graph. 
* 
* @param tag {@link String} = The tag we are looking for. Fully qualified with the namespace if present (e.g. {@code hh:label}) 
* @param parent {@link Node} = Root node of the search 
* @return {@link List<Node>} = The node list 
*/ 
public static List<Node> getElementsByTagName(String tag, Node parent) { 
    List<Node> result = new ArrayList<>(); 

    if (parent == null) { 
     return result; 
    } 

    NodeList children = parent.getChildNodes(); 
    for (int childIdx = 0; childIdx < children.getLength(); childIdx++) { 
     Node child = children.item(childIdx); 
     if (child.getNodeType() != Node.ELEMENT_NODE) { 
      continue; 
     } 
     if (((Element) child).getTagName() == tag) { 
      result.add(child); 
     } 
     getElementsByTagName(tag, child, result); 
    } 
    return result; 
} 

private static void getElementsByTagName(String tag, Node parent, List<Node> partialResult) { 
    if (parent == null) { 
     return; 
    } 

    NodeList children = parent.getChildNodes(); 
    for (int childIdx = 0; childIdx < children.getLength(); childIdx++) { 
     Node child = children.item(childIdx); 
     if (child.getNodeType() != Node.ELEMENT_NODE) { 
      continue; 
     } 
     if (((Element) child).getTagName() == tag) { 
      partialResult.add(child); 
     } 
     getElementsByTagName(tag, child, partialResult); 
    } 
}