반응형
자바 : org.w3c.dom.Document의 모든 요소를 반복하는 가장 효율적인 방법?
Java의 모든 DOM 요소를 반복하는 가장 효율적인 방법은 무엇입니까?
이것과 비슷하지만 현재의 모든 DOM 요소에 대해 org.w3c.dom.Document
?
for(Node childNode = node.getFirstChild(); childNode!=null;){
Node nextChild = childNode.getNextSibling();
// Do something with childNode, including move or delete...
childNode = nextChild;
}
기본적으로 모든 요소를 반복하는 두 가지 방법이 있습니다.
1. 재귀 사용 (내가 생각하는 가장 일반적인 방법) :
public static void main(String[] args) throws SAXException, IOException,
ParserConfigurationException, TransformerException {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document document = docBuilder.parse(new File("document.xml"));
doSomething(document.getDocumentElement());
}
public static void doSomething(Node node) {
// do something with the current node instead of System.out
System.out.println(node.getNodeName());
NodeList nodeList = node.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node currentNode = nodeList.item(i);
if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
//calls this method for all the children which is Element
doSomething(currentNode);
}
}
}
2. 매개 변수로 getElementsByTagName()
메소드를 사용하여 재귀 방지*
:
public static void main(String[] args) throws SAXException, IOException,
ParserConfigurationException, TransformerException {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document document = docBuilder.parse(new File("document.xml"));
NodeList nodeList = document.getElementsByTagName("*");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
// do something with the current element
System.out.println(node.getNodeName());
}
}
}
나는 이러한 방법이 모두 효율적이라고 생각합니다.
도움이 되었기를 바랍니다.
for (int i = 0; i < nodeList.getLength(); i++)
로 변경
for (int i = 0, len = nodeList.getLength(); i < len; i++)
더 효율적입니다.
javanna 대답의 두 번째 방법은 더 평평하고 예측 가능한 메모리 모델을 사용하는 경향이 있으므로 가장 좋습니다.
나는 또한 최근 에이 문제를 우연히 발견했습니다. 여기 내 해결책이 있습니다. 재귀를 피하고 싶었 기 때문에 while 루프를 사용했습니다.
Because of the adds and removes in arbitrary places on the list, I went with the LinkedList
implementation.
/* traverses tree starting with given node */
private static List<Node> traverse(Node n)
{
return traverse(Arrays.asList(n));
}
/* traverses tree starting with given nodes */
private static List<Node> traverse(List<Node> nodes)
{
List<Node> open = new LinkedList<Node>(nodes);
List<Node> visited = new LinkedList<Node>();
ListIterator<Node> it = open.listIterator();
while (it.hasNext() || it.hasPrevious())
{
Node unvisited;
if (it.hasNext())
unvisited = it.next();
else
unvisited = it.previous();
it.remove();
List<Node> children = getChildren(unvisited);
for (Node child : children)
it.add(child);
visited.add(unvisited);
}
return visited;
}
private static List<Node> getChildren(Node n)
{
List<Node> children = asList(n.getChildNodes());
Iterator<Node> it = children.iterator();
while (it.hasNext())
if (it.next().getNodeType() != Node.ELEMENT_NODE)
it.remove();
return children;
}
private static List<Node> asList(NodeList nodes)
{
List<Node> list = new ArrayList<Node>(nodes.getLength());
for (int i = 0, l = nodes.getLength(); i < l; i++)
list.add(nodes.item(i));
return list;
}
반응형
'Programing' 카테고리의 다른 글
웹 사이트 용 Apple Touch 아이콘 (0) | 2020.11.04 |
---|---|
jQuery로 JSON 트리를 검색하는 방법 (0) | 2020.11.04 |
클래스가 정의되었는지 어떻게 확인합니까? (0) | 2020.11.04 |
Sublime Text 2가 시작될 때 마지막으로 열린 파일 / 프로젝트를 열지 못하게하는 방법 (0) | 2020.11.04 |
특정 속성 만있는 태그를 찾는 방법-BeautifulSoup (0) | 2020.11.04 |