dom(一)——获取文本内容的方法

本文介绍了在DOM中通过innerHTML、nodeValue、textContent及innerText等方法获取节点文本内容的方式,并对比了它们之间的区别。
在利用DOM获取节点之后 有多种方法可以获取节点中的文本内容
 
1. innerHTML


innerHTML可以作为获取文本的方法也可以作为修改文本内容的方法

element.innerHTML 会直接返回element节点下所有的HTML化的文本内容

<body>
        <div>文本</div>
        <div>文本</div>
        
</body>
document.body.innerHTML    //返回"<div>文本</div><div>文本</div>";

同样逆向的:

document.body.innerHTM="<div>文本</div><div></div>"会生成

<body>

    <div>文本</div>
    <div>文本</div>

</body>

!注意 innerHTML方法只能作用于元素节点调用;文本节点并不能使用这个方法返回undefined!


2. nodeValue


nodeValue是一个HTML DOM的对象属性;

同样的 可以通过 nodeValue设置节点的文本内容也可以直接返回文本内容

直接用节点对象调用就都可以: 如上例   

document.getElementsByTagName(div)[0].childNodes[0].nodeValue //返回“文本”


另外 nodeValue 属性并不只存在于文本节点下  元素节点和属性节点对象也都具有nodeValue属性

属性节点的 nodeValue属性返回属性值
元素节点的 nodeValue属性返回null

3.textContent

textContent与innerHTML方法类似会返回对象节点下所有的文本内容

但是区别为 textContent返回的内容只有去HTML化的文本节点的内容 如上例:

document.body.textContent //返回"文本文本" !注意在DOM中标签换行产生的空白字符会计入DOM中作为文本节点

另外IE8以前不支持textContent属性


4.innerText


innerText方法与textContent方法类似 并且和innerHTML一样也是作用于元素节点上

但是浏览器对于这两种方法解析空白字符的机制不一样;不是很常用


类似的还有outText outHTML等类似操作文本相关的方法,不是很常用不介绍了;

最后要提醒一点:文本与文本节点一定要区分,有些方法是依靠元素节点返回子文本内容,有些方法是文本节点返回自身文本内容,文本节点是对象而文本只是字符串;

<think>嗯,用户这次的问题是询问Java如何解析XML文件流数据来获取文本内容。从对话历史看,用户之前应该接触过XML解析的基础知识,现在需要处理更具体的流式数据场景。 用户可能正在处理大文件或网络流数据,因此关注点在于内存效率和实时性。ta提到的“文件流数据”暗示了数据来源可能是持续输入的流(如网络Socket或大文件),而非完整存储在内存的文件。这比普通文件解析要求更高。 注意到用户提供了两个站内引用:第个讨论XML的适用场景,第二个展示Dom4j解析静态文件。但用户明确表示这些不是真实需求,需要聚焦“流数据解析方法”。这说明用户已经做过基础调研,现在需要针对性方案。 技术上,Java解析XML流数据主要有SAX和StAX两种方式: - SAX基于事件驱动,内存占用固定,但需要实现回调接口 - StAX提供拉式解析器,控制更灵活 两者都比DOM/Dom4j更适合流数据,因为后者需要加载整个文档到内存。 用户没有指定具体场景,但补充说明“获取文本内容”可能意味着ta需要提取XML中的文本节点(如日志内容或消息体)。这里需要特别处理CDATA区块和字符实体。 考虑到用户可能遇到的实际问题,在示例代码中加入了异常处理和资源关闭逻辑。因为流解析常涉及网络或文件IO,必须确保finally块释放资源。另外标注了字符编码的重要性——这是流解析中常见的坑点。 最后生成的相关问题覆盖了进阶需求:性能对比帮助选型,大文件处理针对实际痛点,异常处理则是工程必备。如果用户正在开发实时系统,可能还会需要XML解析与流式API(如Reactive Streams)的集成,但这需要更多上下文信息才适合展开。 </think> 在Java中解析XML文件流数据获取文本内容,推荐使用**SAX(Simple API for XML)** 或**StAX(Streaming API for XML)** 这两种基于事件驱动的流式解析方式。它们无需加载整个文档到内存,适合处理大文件或流数据。以下是具体实现方法: --- ### 方法:SAX解析器(事件驱动) ```java import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.InputStream; public class SaxXmlStreamParser { public static void parseStream(InputStream xmlStream) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); // 自定义事件处理器 DefaultHandler handler = new DefaultHandler() { private StringBuilder currentText = null; private boolean isTargetElement = false; @Override public void startElement( String uri, String localName, String qName, Attributes attributes ) { // 匹配目标元素(例如:<content>) if ("content".equalsIgnoreCase(qName)) { isTargetElement = true; currentText = new StringBuilder(); } } @Override public void characters(char[] ch, int start, int length) { if (isTargetElement && currentText != null) { currentText.append(ch, start, length); // 累积文本内容 } } @Override public void endElement(String uri, String localName, String qName) { if ("content".equalsIgnoreCase(qName)) { System.out.println("提取内容: " + currentText.toString().trim()); isTargetElement = false; currentText = null; } } }; // 解析输入流 saxParser.parse(new InputSource(xmlStream), handler); } public static void main(String[] args) throws Exception { try (InputStream is = SaxXmlStreamParser.class.getResourceAsStream("data.xml")) { parseStream(is); } } } ``` #### 关键点: 1. **事件驱动**:通过`startElement()`、`characters()`、`endElement()`回调方法处理数据。 2. **逐块读取**:流式读取,内存占用恒定(与文件大小无关)。 3. **目标元素过滤**:通过标签名(如`<content>`)定位需提取文本节点。 --- ### 方法二:StAX解析器(拉式流解析) ```java import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; import java.io.InputStream; public class StaxXmlStreamParser { public static void parseStream(InputStream xmlStream) throws Exception { XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader reader = factory.createXMLStreamReader(xmlStream); while (reader.hasNext()) { int eventType = reader.next(); if (eventType == XMLStreamConstants.START_ELEMENT) { String tagName = reader.getLocalName(); // 匹配目标元素(例如:<content>) if ("content".equalsIgnoreCase(tagName)) { // 直接读取元素内的文本 String text = reader.getElementText(); System.out.println("提取内容: " + text.trim()); } } } reader.close(); } public static void main(String[] args) throws Exception { try (InputStream is = StaxXmlStreamParser.class.getResourceAsStream("data.xml")) { parseStream(is); } } } ``` #### 关键点: 1. **拉式解析**:主动控制遍历过程(`next()`方法推进指针)。 2. **直接获取文本**:`getElementText()`自动合并元素内所有文本节点。 3. **更简洁的API**:相比SAX逻辑更直观。 --- ### 两种方法对比 | **特性** | SAX | StAX | |-------------------|----------------------------------|--------------------------| | **解析模式** | 事件驱动(推送) | 流式拉取 | | **内存占用** | 极低(常量级) | 极低(常量级) | | **控制灵活性** | 需通过回调处理 | 直接控制解析流程 | | **代码复杂度** | 较高(需实现多个回调方法) | 较低(顺序读取) | | **适用场景** | 超大文件、只读场景 | 需灵活跳转的流处理 | --- ### 注意事项 1. **字符编码**:确保`InputStream`的编码与XML声明致(如`<?xml version="1.0" encoding="UTF-8"?>`)。 2. **异常处理**:捕获`XMLStreamException`、`SAXException`并关闭资源(用`try-with-resources`)。 3. **性能优化**:避免在事件回调中执行复杂逻辑,防止阻塞流读取。 > 示例中假设目标文本位于`<content>`标签内,实际使用时需替换为业务相关的XML元素名[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值