2015-07-31 2 views
0

После разбора следующий 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 

ответ

2

Скорее всего, HTML анализатор фиксирует недействительный HTML. Внутри тегов div тегов не допускается. Как только у вас есть Document-объект, html уже разбирается и фиксируется.

+0

да, это было! я только что подтвердил. Спасибо! – golakers

+0

Знаете ли вы какие-нибудь хорошие чистящие средства xml, которые не будут менять мои узлы? синтаксический анализатор по умолчанию работает только с w/div внутри тегов: Document doc = builder.parse (новый ByteArrayInputStream (myxml.getBytes())); – golakers

+0

Хороший анализатор/очистка html - JSoup. Но, насколько я знаю, он также перестраивает структуру, если она недействительна. Если вы не хотите, чтобы структура была изменена, вы должны пойти с чистым анализом xml. – johannesv

Смежные вопросы