如何用Java从XML中获取带标签的完整内容?
获取XML中标签的完整带标签内容
嘿,这个问题我太熟悉了!getTextContent()方法的设计就是只提取节点下的纯文本内容,所以它会自动忽略掉子标签。要拿到包含<p>在内的完整内容,咱们可以借助Transformer把<content>的子节点转换成XML字符串,具体修改如下:
修改后的完整代码示例
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.io.File; import java.io.StringWriter; public class XmlParser { public static void main(String[] args) { try { File fXmlFile = new File("./Index.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); // 注意:如果XML里有命名空间,可能需要设置dbFactory.setNamespaceAware(true); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); doc.getDocumentElement().normalize(); // 获取<content>节点 NodeList contentNodes = doc.getElementsByTagName("content"); if (contentNodes.getLength() > 0) { Node contentNode = contentNodes.item(0); // 使用Transformer将节点的子节点转换成字符串 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); // 可选:设置输出格式,比如去掉多余的换行和空格 // transformer.setOutputProperty(OutputKeys.INDENT, "no"); DOMSource source = new DOMSource(contentNode.getFirstChild()); // 取content的子节点(也就是<p>hello</p>) StringWriter writer = new StringWriter(); StreamResult result = new StreamResult(writer); transformer.transform(source, result); // 输出完整的带标签内容 String fullContent = writer.toString(); System.out.println("完整内容:" + fullContent); } } catch (Exception e) { e.printStackTrace(); } } }
关键步骤说明
- 首先通过
getElementsByTagName("content")定位到目标节点 - 用
Transformer把<content>的子节点(也就是你要的<p>hello</p>)转换成XML字符串,而不是直接取文本 - 如果需要控制输出格式(比如去掉缩进),可以添加
transformer.setOutputProperty()相关配置
补充小技巧
如果你的<content>标签下有多个子节点,直接用new DOMSource(contentNode)的话,会连<content>标签本身一起输出。如果只需要内部内容,就用contentNode.getFirstChild()(如果只有一个子节点),或者遍历所有子节点逐个转换拼接。
内容的提问来源于stack exchange,提问作者Rank Bazaar
相关产品推荐
相关产品推荐

