【问题标题】:How to get HTML structure From a XML File如何从 XML 文件中获取 HTML 结构
【发布时间】:2018-12-06 12:07:44
【问题描述】:

假设xml文件是这样的:

<!DOCTYPE html [
<!ENTITY ldquo "&#x2665;">
]>
<DATA>
<ROW>
        <Id>29855</Id>
        <content><p>Did the summer fly as fast &ldquo;</p>
                  <a href="https://www.ex.com/" target="_blank"></content>
<ROW>
<ROW>
        <Id>11223</Id>
        <content><p>Fly as fast &ldquo;</p>
                  <a href="https://www.ex.com/" target="_blank"></content>
<ROW>
</DATA>

要求是从xml中获取“id”和“content”。内容应采用 html 结构,因为它存在于 xml 文件中。喜欢:

<p>Fly as fast &ldquo;</p>
                  <a href="https://www.ex.com/" target="_blank">

我试过了,但我得到的是字符串格式的内容,比如:Fly as fast “

这是我用来解析 xml 的代码:

File fXmlFile = new File("D:\\customer_connect_posts.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);
            doc.getDocumentElement().normalize();

            System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
            NodeList nList = doc.getElementsByTagName("ROW");
            System.out.println("----------------------------");

            for (int temp = 0; temp < nList.getLength(); temp++) {
                Node nNode = nList.item(temp);
                System.out.println("\nCurrent Element :" + nNode.getNodeName());
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;
                    /*System.out.println("Staff id : "
                                       + eElement.getAttribute("Name"));*/
                    System.out.println("First Name : "
                                       + eElement.getElementsByTagName("Id")
                                         .item(0).getTextContent());
                    System.out.println("Last Name : "
                                       + eElement.getElementsByTagName("content").item(0).getTextContent())
                                         );
}
            }
            } catch (Exception e) {
            e.printStackTrace();
            }

问题是我正在调用返回文本的“getTextContent()”方法。有没有其他方法可以做到这一点。 需要帮助...

【问题讨论】:

    标签: java xml xml-parsing


    【解决方案1】:

    要从 DOM Node 获取 html 中的文本,您应该将其序列化为 html。您可以使用 Saxon 执行此操作,并使用默认的 Transformer Similar problem

     Node content = eElement.getElementsByTagName("content").item(0);
     StringWriter sw = new StringWriter();
     Result result = new StreamResult(sw);
     TransformerFactory factory = new TransformerFactoryImpl();
     Transformer proc = factory.newTransformer();
     proc.setOutputProperty(OutputKeys.METHOD, "html");
     for (int i = 0; i < content.getChildNodes().getLength(); i++) {
         proc.transform(new DOMSource(content.getChildNodes().item(i)), result);
     }
     System.out.println("Content:" + sw.toString().trim());
    

    你应该看到下一个输出:

    Current Element :ROW
    First Name : 29855
    Content:<p>Did the summer fly as fast</p>
            <a href="https://www.ex.com/" target="_blank"></a>
    
    Current Element :ROW
    First Name : 11223
    Content:<p>Fly as fast</p>
            <a href="https://www.ex.com/" target="_blank"></a>
    

    并且在您的文档标签中&lt;ROW&gt; 应该以&lt;/ROW&gt; 结束。也适用于&lt;a&gt;。但是你可以使用简化录音&lt;a href=... /&gt;

    【讨论】:

      【解决方案2】:

      您需要使用 CDATA 或对 HTML 进行编码以将 HTML 存储在 XML 中,否则 HTML 元素将被解释为 XML 元素。此外,您的 ROW 元素似乎没有关闭。 我建议像这样使用 CDATA

      <DATA>
          <ROW>
              <Id>29855</Id>
              <content><![CDATA[<p>Did the summer fly as fast &ldquo;</p>
                  <a href="https://www.ex.com/" target="_blank">]]>
              </content>
          </ROW>
          <ROW>
              <Id>11223</Id>
              <content><![CDATA[<p>Fly as fast &ldquo;</p>
                  <a href="https://www.ex.com/" target="_blank">]]>
              </content>
          </ROW>
      </DATA>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-08
        • 2019-12-28
        • 2011-04-28
        • 1970-01-01
        • 2022-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多