После разбора следующий XML,Почему org.w3c.dom анализирует мой xml неправильно?
<html>
<body>
<a>
<div>
<span>foo</span>
</div>
</a>
</body>
</html>
org.w3c.dom Документ анализируется с javax.xml.xpath указывает на следующее:
div
является родительским узломa
a
является родительским узлом изspan
Почему это, и как я могу правильно разобрать этот xml?
Вот код, который я использую, а затем метод, используемый для создания объекта Document, а затем вывод кода.
String myxml = ""
+ "<html>"
+ "<body>"
+ "<a>"
+ "<div>"
+ "<span>foo</span>"
+ "</div>"
+ "</a>"
+ "</body>"
+ "</html>";
Document doc = HttpDownloadUtilities.getWebpageDocument_fromSource(myxml);
XPath xPath = XPathFactory.newInstance().newXPath();
Node node = ((Node)xPath.compile("//*[text() = 'foo']").evaluate(doc, XPathConstants.NODE));
System.out.println(" node tag: " + node.getNodeName());
System.out.println(" parent tag: " + node.getParentNode().getNodeName());
System.out.println("grandparent tag: " + node.getParentNode().getParentNode().getNodeName());
Set<Node> nodes = H.getSet((NodeList)xPath.compile("//*").evaluate(doc, XPathConstants.NODESET));
for (Node n : nodes) {
System.out.println();
try {
System.out.println("node: " + n.getNodeName());
} catch (Exception e) {
}
try {
System.out.println("child: " + n.getChildNodes().item(0).getNodeName());
} catch (Exception e) {
}
}
здесь является методом, используемым для создания объекта Document:
public static Document getWebpageDocument_fromSource(String source) throws InterruptedException, IOException {
try {
HtmlCleaner cleaner = new HtmlCleaner();
CleanerProperties props = cleaner.getProperties();
props.setAllowHtmlInsideAttributes(true);
props.setAllowMultiWordAttributes(true);
props.setRecognizeUnicodeChars(true);
props.setOmitComments(true);
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
try {
builder = builderFactory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
TagNode tagNode = new HtmlCleaner().clean(source);
Document doc = new DomSerializer(new CleanerProperties()).createDOM(tagNode);
return doc;
} catch (ParserConfigurationException ex) {
ex.printStackTrace();
return null;
}
}
выход:
node tag: span
parent tag: a
grandparent tag: div
node: html
child: head
node: head
node: body
child: html
node: html
child: body
node: body
child: a
node: a
node: div
child: a
node: a
child: span
node: span
child: #text
да, это было! я только что подтвердил. Спасибо! – golakers
Знаете ли вы какие-нибудь хорошие чистящие средства xml, которые не будут менять мои узлы? синтаксический анализатор по умолчанию работает только с w/div внутри тегов: Document doc = builder.parse (новый ByteArrayInputStream (myxml.getBytes())); – golakers
Хороший анализатор/очистка html - JSoup. Но, насколько я знаю, он также перестраивает структуру, если она недействительна. Если вы не хотите, чтобы структура была изменена, вы должны пойти с чистым анализом xml. – johannesv