2015-11-10 2 views
1

Я создал метод, который извлекает данные из html-документа, используя компоненты xpath саксон-он. Для этого я использую объектную модель w3c dom.Как получить html из org.w3c.dom.Node в java?

Я уже создал метод, который возвращает текст-значение, аналогичное как метод значения текста из jsoup (jsoupElement.text()):

protected String getNodeValue(Node node) { 
    NodeList childNodes = node.getChildNodes(); 
    for (int x = 0; x < childNodes.getLength(); x++) { 
     Node data = childNodes.item(x); 
     if (data.getNodeType() == Node.TEXT_NODE) 
      return data.getNodeValue(); 
    } 
    return ""; 
} 

Это прекрасно работает, но я теперь мне нужно основной HTML выбранного узла (с jsoup это будет jsoupElement.html()). Используя объектную модель w3c dom, у меня есть org.w3c.dom.Node. Как я могу получить html из org.w3c.dom.Node как String? Я не мог найти ничего такого в документации.

Просто для уточнения: Мне нужен внутренний html (с или без элемента узла/тега) как String. Подобно как http://api.jquery.com/html/ или http://jsoup.org/apidocs/org/jsoup/nodes/Element.html#html--

+1

В Java вы можете сериализовать дочерние узлы или сам узел с помощью LSSerializer или используя трансформатор по умолчанию, однако они дадут вам сериализацию XML дерева DOM, а не оригинальный XML или HTML. –

+0

Спасибо за ваш ответ. Возможно ли получить исходный html с использованием другой объектной модели документа? Я могу выбирать между этими моделями: http://www.saxonica.com/documentation/index.html#!xpath-api/jaxp-xpath/factory – whitenexx

+1

Я не думаю, что есть какой-либо способ получить исходный HTML из любого дерева, он хранит узлы, а не разметку. Я не знаком с jsoup, но они, вероятно, также сериализуют свое дерево, только для HTML, а не для XML, если вы вызываете этот метод, чтобы дать вам внутренний HTML. Saxon как процессор XSLT 2 поддерживает сериализацию HTML и XHTML с таблицей стилей XSLT, имеющей правильный метод вывода (например, '' или '') поэтому вы можете использовать Transformer со стилем, устанавливая метод по мере необходимости. Возможно, API также предлагает какой-то способ. –

ответ

0

Для сериализации дочерних узлов консорциума W3C DOM Node «s в HTML с Saxon вы можете использовать по умолчанию Transformer где вы установили метод вывода в html:

public static String getInnerHTML(Node node) throws TransformerConfigurationException, TransformerException 
{ 
    StringWriter sw = new StringWriter(); 
    Result result = new StreamResult(sw); 
    TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl(); 
    Transformer proc = factory.newTransformer(); 
    proc.setOutputProperty(OutputKeys.METHOD, "html"); 
    for (int i = 0; i < node.getChildNodes().getLength(); i++) 
    { 
     proc.transform(new DOMSource(node.getChildNodes().item(i)), result); 
    } 
    return sw.toString(); 
} 

Но как уже упоминалось, представляет собой сериализацию дерева, исходный XML или HTML не сохраняется в дереве DOM или в деревенской модели Saxon, нет доступа к нему.