그것은 빈 디렉토리를 삭제 같다 : 당신은 깊이 우선 재귀 산책을 할 필요가 : 모든 하위 디렉토리가 삭제 된 경우, 다음 하나는 현재 디렉토리를 삭제 고려할 수 있습니다.
결과적으로 삭제는 Java에서 재귀를 사용하여 수행하는 것이 가장 좋습니다. 장점은 사본이 필요 없다는 것입니다.
코드 요청에
의 XML API를 사용하여 작업하는 매우 단편적인 한, 일부 검증되지 않은 코드 :
는
import java.io.*;
import java.util.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
public class XmlCleanup {
public static void main(String[] args) {
if (args.length == 0) {
args = new String[] { "/home/joop/Labortablo/test1.xml" };
}
new XmlCleanup().process(args[0]);
}
public void process(String xmlPath) {
try {
// Read XML document:
DocumentBuilder builder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(new File(xmlPath));
removeEmptyChildElements(doc.getDocumentElement());
// Write XML document back:
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(xmlPath
.replaceFirst("\\.xml$", "") + "-clean.xml"));
transformer.transform(source, result);
} catch (TransformerException ex) {
Logger.getLogger(XmlCleanup.class.getName()).log(Level.SEVERE, null, ex);
} catch (SAXException ex) {
Logger.getLogger(XmlCleanup.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(XmlCleanup.class.getName()).log(Level.SEVERE, null, ex);
} catch (ParserConfigurationException ex) {
Logger.getLogger(XmlCleanup.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void removeEmptyChildElements(Element parentElement) {
List<Element> toRemove = new LinkedList<Element>();
NodeList children = parentElement.getChildNodes();
int childrenCount = children.getLength();
for (int i = 0; i < childrenCount; ++i) {
Node child = children.item(i);
if (child.getNodeType() == Node.ELEMENT_NODE) {
Element childElement = (Element) child;
removeEmptyChildElements(childElement);
if (elementIsRedundant(childElement)) {
toRemove.add(childElement);
}
}
}
for (Element childElement: toRemove) {
parentElement.removeChild(childElement);
}
parentElement.normalize();
}
private boolean elementIsRedundant(Element element) {
if (element.hasAttributes())
return false;
if (!element.hasChildNodes())
return true;
NodeList children = element.getChildNodes();
int childrenCount = children.getLength();
for (int i = 0; i < childrenCount; ++i) {
Node child = children.item(i);
String value = child.getNodeValue();
if (value != null && !value.matches("\\s*")) {
return false; // Found non-whitespace text
}
}
return true;
}
}
그것은 그래서 당신은 XSLT 변환을 사용할 수 있습니다 java.xml.transform
를 사용 너무; 조금 더 간단하면 javax.xml.stream.XMLOutputFactory
을 사용하는 것입니다.
xml을 구문 분석하고 각 요소에서 하위 및 특성을 확인하는 것이 옵션이 아닙니다. – tartak
@CatalinCiobanu 그렇습니다. – achraf
일 수 있습니다. List과 같은 요소를 얻을 수 있었고 크기를 묻습니다. 그러나 우리 동료 인 Joop Eggen은 더 나은 (훨씬 더 좋은) 솔루션 -> 재귀를 제안합니다! –
tartak