jsoup的Node类

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

一、简介

Node类直接继承Object,实现了Cloneable接口,它是一个抽象类,类声明:public abstract class Node extends Object implements Cloneable

直接已知子类:Comment, DataNode, DocumentType, Element, TextNode, XmlDeclaration

Node是节点的抽象模型。Elements, Documents, Comments等都是节点的实例。

二、构造方法

1、protected Node(String baseUri, Attributes attributes)        创建一个新的节点(Node)对象。

参数:baseUri - base URI

            attributes - attributes (not null, but may be empty)

2、protected Node(String baseUri)   创建一个新的节点(Node)对象。指定了baseUri

3、protected Node()  使用默认构造器创建Node对象。不会创建base uri、子节点、属性。谨慎使用。

三、方法详细

1、public abstract String nodeName()   抽象方法。获取节点名称。

2、public String attr(String attributeKey)  通过键(key)来获取属性的值(value)。另外,此方法可以将相对路劲的url转变为绝对路劲,只要将key加上前缀abs。如:String url = a.attr("abs:href");

3、public Attributes attributes()  获取元素的所有属性。

4、public Node attr(String attributeKey, String attributeValue) 通过键设置属性的值。   参数:attributeKey -属性的键 。  attributeValue - 属性的值。

5、public boolean hasAttr(String attributeKey)  检测元素是否有attributeKey键指定的属性。

6、public Node removeAttr(String attributeKey)   从元素中移除attributeKey键指定的属性。

7、public String baseUri()   获取节点的base Url

8、public void setBaseUri(String baseUri)  更新节点和其子孙的base URI

9、public String absUrl(String attributeKey) 从一个可能是相对路劲的URI属性中获取为绝对路径的URL   如:String absUrl = linkEl.absUrl("href");

   如果URL已经是绝对路劲,就直接返回它,否则使用baseUri将其转换为绝对路劲的URL

10、public Node childNode(int index)  根据索引得到其相应子节点。

11、public List<Node> childNodes()  得到所有子节点的集合。此集合不能被修改,即不能添加新的字节点。但是原子节点本身可以被操纵。

12、protected Node[] childNodesAsArray() 返回所有子节点的数组。

13、public Node parent() 得到此节点的父节点。如果没有父节点,则返回null。

14、public Document ownerDocument() 得到该节点相关联的Document对象。

15、public void remove() 从DOM树中移除该节点。如果该节点有子节点,则他们也将都被移除。

16、public Node before(String html)  在该节点前面插入一段指定的html到DOM树中

17、public Node before(Node node)  在该节点前面插入一个指定的节点到DOM树中

18、public Node after(String html)     在该节点后面插入一段指定的html到DOM树中

19、public Node after(Node node)   在该节点后面插入一个指定的节点到DOM树中

20、public Node wrap(String html)   用提供的html包装该节点。

21、public Node unwrap()   移除该节点,但保留它的子节点。即它的子节点将取代它的位置而连在其父节点上。返回的是该节点的第一个子节点。如果没有子节点则返回null。

22、public void replaceWith(Node in) 用提供的节点替代该节点在DOM树中的位置。

23、protected void setParentNode(Node parentNode)   设置该节点的父节点为parentNode

24、protected void replaceChild(Node out, Node in)   替换该节点的某个子节点。out为要被替换的节点。in为用来替换的新节点。

25、protected void removeChild(Node out)  移除该节点的指定子节点(out)

26、protected void addChildren(Node... children)  为该节点增加子节点。

27、protected void addChildren(int index, Node... children)  在指定索引位置上为该节点增加子节点。

28、public List<Node> siblingNodes()  返回该节点的兄弟节点的集合。如果该节点没有父节点,则返回空集合。

29、public Node nextSibling()  得到该节点的下一个兄弟节点。如果该节点已是最后一个节点,则返回null。

30、public Node previousSibling()  得到该节点的上一个兄弟节点。如果该节点是第一个节点,则返回null。

31、public int siblingIndex()  得到该节点在所有兄弟节点集合中的索引,即位置。如果该节点是第一个,则返回0.

32、protected void setSiblingIndex(int siblingIndex)   设置该节点在兄弟节点集合中的位置。

33、public Node traverse(NodeVisitor nodeVisitor)   根据该节点及其子节点进行深度优先的遍历。   参数:nodeVisitor - the visitor callbacks to perform on each node

34、public String outerHtml()   得到该节点的外部html。

35、protected void outerHtml(StringBuilder accum)  得到该节点的外部html。

36、public String toString()  覆盖Object的toString

37、protected void indent(StringBuilder accum, int depth, Document.OutputSettings out)

38、public boolean equals(Object o) 覆盖Object的equals

39、public int hashCode()  覆盖Object的hashCode

40、public Node clone()   深复制克隆一个节点  。覆盖Object的clone

41、protected Node doClone(Node parent)

<think>我们正在处理一个关于Java中NodegetAttribute方法的使用问题。根据引用[2],我们了解到在解析XML文件时,可以通过element.getAttribute("attribute_name")来获取元素的属性值。但是,用户提到的是“Java node”,这可能指的是DOM解析中的Node接口。 在DOM(Document Object Model)中,Node是一个基础接口,Element接口继承自Node。getAttribute方法实际上是定义在Element接口中的,而不是在Node接口中。因此,如果用户有一个Node对象,需要先判断它是否为Element型,然后进行型转换,再使用getAttribute方法。 步骤: 1. 解析XML文档,获取文档的根元素或特定节点。 2. 遍历节点或直接定位到目标节点(可能是元素节点)。 3. 判断节点型是否为元素节点(Node.ELEMENT_NODE)。 4. 如果是元素节点,则将其转换为Element型。 5. 使用Element的getAttribute方法获取属性值。 示例代码: 假设我们有如下XML内容: ```xml <book id="123" category="programming"> <title>Java Programming</title> <author>James Gosling</author> </book> ``` 我们想要获取book元素的id属性值。 ```java import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class XmlAttributeExample { public static void main(String[] args) { try { // 创建DocumentBuilderFactory实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); // 假设我们有一个XML文件,这里用字符串代替,实际中可以从文件或输入流读取 // 为了示例,我们直接解析一个字符串(实际中需要更复杂的处理) // 这里省略从文件读取的步骤,假设已经得到Document对象 // 解析XML文件,获取Document对象 Document document = builder.parse("books.xml"); // 或者使用其他输入源 // 获取根元素 Element root = document.getDocumentElement(); // 获取所有名为"book"的元素 NodeList bookList = root.getElementsByTagName("book"); // 遍历book元素 for (int i = 0; i < bookList.getLength(); i++) { Node node = bookList.item(i); // 检查节点型是否为元素节点 if (node.getNodeType() == Node.ELEMENT_NODE) { Element bookElement = (Element) node; // 获取id属性 String id = bookElement.getAttribute("id"); System.out.println("Book id: " + id); // 获取category属性 String category = bookElement.getAttribute("category"); System.out.println("Category: " + category); } } } catch (Exception e) { e.printStackTrace(); } } } ``` 注意事项: - 如果节点不是元素节点(例如是文本节点、注释节点等),则不能使用getAttribute方法。 - 如果属性不存在,getAttribute方法将返回空字符串("")。 另外,引用[1]中展示了一段HTML解析的代码,使用了Parser和NodeFilter,这可能是另一个解析库(如HtmlParser)。如果用户是在解析HTML,那么可能需要使用不同的库(如jsoup)或者像示例中那样使用特定的解析器。但是,用户的问题是关于Node的getAttribute方法,在标准DOM中,我们使用上述方法。 如果用户使用的是其他解析库(如jsoup),则方法会有所不同。例如,在jsoup中,可以直接使用element.attr("attributeName")来获取属性值。但根据用户的问题,他提到了“Node”,所以我们假设是DOM解析。 总结: 在Java标准DOM解析中,获取节点属性值需要将Node转换为Element,然后调用getAttribute方法。 相关问题: 1. 如何处理XML命名空间下的属性获取? 2. 除了getAttribute,还有哪些方法可以获取节点的属性? 3. 如何修改XML节点的属性值? 4. 在解析HTML时,使用jsoup库如何获取属性值?</think>### Java NodegetAttribute方法使用指南 在Java中操作XML或HTML节点时,获取节点属性值主要通过`getAttribute()`方法实现。根据DOM规范,该方法属于`Element`接口(继承自`Node`接口)。以下是详细使用指南: #### 1. **基本用法** ```java // 获取元素节点 Element element = (Element) node; // 需先将Node转为Element型 // 获取特定属性值 String attrValue = element.getAttribute("attribute_name"); ``` - **参数**:属性名称(区分大小写) - **返回值**:属性值字符串(若属性不存在则返回空字符串`""`) #### 2. **完整操作流程(基于DOM解析)** ```java import org.w3c.dom.*; import javax.xml.parsers.*; // 解析XML/HTML文档 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("input.xml"); // 或HTML文件 // 获取目标节点(示例:获取所有<table>标签) NodeList tables = doc.getElementsByTagName("table"); for (int i = 0; i < tables.getLength(); i++) { Node node = tables.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element table = (Element) node; // 获取属性值(示例:获取id属性) String id = table.getAttribute("id"); System.out.println("Table ID: " + id); } } ``` #### 3. **关键注意事项** 1. **节点型转换** `getAttribute()`仅适用于`Element`节点型。需先验证节点型: ```java if (node.getNodeType() == Node.ELEMENT_NODE) { Element el = (Element) node; String value = el.getAttribute("data-key"); } ``` 2. **属性不存在处理** 当属性不存在时返回空字符串,建议添加判空逻辑: ```java String classVal = element.getAttribute("class"); if (!classVal.isEmpty()) { // 处理有效属性值 } ``` 3. **命名空间处理** 若XML包含命名空间,需使用: ```java String nsValue = element.getAttributeNS("http://namespace-uri", "localName"); ``` #### 4. **HTML解析的特殊情况** 对于HTML解析(如引用[1]的代码),第三方库如**Jsoup**更简便: ```java // 使用Jsoup库(推荐) Document htmlDoc = Jsoup.parse(htmlContent); Element div = htmlDoc.select("div#header").first(); String dataAttr = div.attr("data-custom"); // 直接获取属性 ``` #### 5. **常见错误规避** - **ClassCastException**:未验证节点型直接强转为`Element` - **NullPointerException**:未检查节点是否存在 - **命名空间忽略**:未处理带前缀的属性(如`xlink:href`) > **最佳实践**:优先使用`Element`接口而非通用`Node`接口操作属性,可避免型转换错误[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值