2017-09-15 75 views
1

我有一個com.google.gwt.xml.client.Document對象形式的XML文檔。由於在Document類中沒有提供'getElementsByTagNameNS'API,是否可以使用一些本地Javascript函數來實現相同?從GWT代碼調用getElementsByTagNameNS

該API應該採取兩個參數 1 - 命名空間前綴。 2 - XML標籤名稱。

我需要這個,因爲如果XML標籤有一個命名空間前綴,則最近的Chrome更新(v60)不會返回DocumentList.getElementsByTagName(「book」)的NodeList。

回答

0

c.g.g.xml從來不支持名稱空間,因此不能用於使用XML名稱空間的文檔。它也包裝本地對象,並且不給它們任何訪問權限。現在,我想在API的瀏覽器支持方面幾乎沒有區別(例如IE6不是這種情況),所以你最好重寫你的代碼來使用JsInterop而不是cggxml(看一看在元素2,應該已經有映射)

0

我已經實現了一個快速和髒的替代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); 
    } 
}