使用jaxp进行dom解析_动力节点Java学院整理

网友投稿 291 2023-04-24


使用jaxp进行dom解析_动力节点Java学院整理

1.javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回

2.调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。

3.调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

4.调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

案例1.遍历xml文件中跟节点下面的所有子节点.

1.xml的约束文件Java.dtd

<!ELEMENT classes (java班,net班,php班,ios班)>

<!ELEMENT java班 (teachers?,students?)>

<!ELEMENT net班 (teachers?,students?)>

<!ELEMENT php班 (teachers?,students?)>

<!ELEMENT ios班 (teachers?,students?)>

<!ELEMENT teachers (teacher*)>

<!ELEMENT teacher EMPTY>

<!ELEMENT students (student*)>

<!ELEMENT student (name,sex,age)>

<!ATTLIST java班 name CDATA #IMPLIED>

<!ATTLIST net班 name CDATA #IMPLIED>

<!ATTLIST php班 name CDATA #IMPLIED>

<!ATTLIST ios班 name CDATA #IMPLIED>

<!ATTLIST teacher name CDATA #IMPLIED>

<!ATTLIST teacher sex CDATA #IMPLIED>

<!ATTLIST teacher age CDATA #IMPLIED>

<!ELEMENT name (#PCDATA)>

<!ELEMENT sex (#PCDATA)>

<!ELEMENT age (#PCDATA)>

<!ATTLIST student id ID #IMPLIED>

2.xml文件内容如下java.xml

王亮

28

xxx

3.遍历xml文件的操作

//1.获取XML的根节点对象

@Test

public void test() throws ParserConfigurationException, SAXException, IOException{

//调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

//调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象

DocumentBuilder builder = builderFactory.newDocumentBuilder();

//通过文件的方式获取Document对象

/*File file = new File("src//parsers//java.xml");

System.out.println(file+"----");

Document document = builder.parse(file);*/

//解析指定的文件

InputStream is= this.getClass().getClassLoader()

.getResourceAsStream("parsers//java.xml");

Document document = builder.parse(is);

//document.getDocumentElement()获取根节点的元素对象

Element root = document.getDocumentElement();

//遍历根节点下面的所有子节点

listNodes(root);

}

2.遍历节点对象的方法

/**

* 遍历根据节点对象下面的所有的节点对象

* @param node

*/

public void listNodes(Node node) {

// 节点是什么类型的节点

if (node.getNodeType() == Node.ELEMENT_NODE) {// 判断是否是元素节点

Element element = (Element) node;

//判断此元素节点是否有属性

if(element.hasAttributes()){

//获取属性节点的集合

NamedNodeMap namenm = element.getAttributes();//Node

//遍历属性节点的集合

for(int k=0;k

//获取具体的某个属性节点

Attr attr = (Attr) namenm.item(k);

System.out.println("name:::"+attr.getNodeName()+" value::"

+attr.getNodeValue()+" type::"+attr.getNodeType());

}

}

//获取元素节点的所有孩子节点

NodeList listnode = element.getChildNodes();

//遍历

for (int j = 0; j < listnode.getLength(); j++) {

//得到某个具体的节点对象

Node nd = listnode.item(j);

System.out.println("name::" + nd.getNodeName() + " value:::"

+ nd.getNodeValue() + " type:::" + nd.getNodeType());

//重新调用遍历节点的操作的方法

listNodes(nd);

}

}

}

4.查询某个节点对象(简单列举一些案例)

/**

* 根据标签的名称查找所有该名称的节点对象

*/

public void findNode(Document document) {

//根据标签名称获取该名称的所有节点对象

NodeList nodelist = document.getElementsByTagName("teacher");

//遍历

for (int i = 0; i < nodelist.getLength(); i++) {

//得到具体的某个节点对象

Node node = nodelist.item(i);

System.out.println(node.ghttp://etNodeName());

}

}

/**

* 根据属性的值 查询某个节点对象

* 属性值是唯一(假设)

* @param document

* @param value

* @return

*/

public Node findNodeByAttrValue(Document document, String value) {

//根据标签名称获取该名称的节点对象集合

NodeList nodelist = document.getElementsByTagName("teacher");

//遍历

for (int i = 0; i < nodelist.getLength(); i++) {

//获取某个具体的元素节点对象

Element node = (Element) nodelist.item(i);

//根据属性名称获取该节点的属性节点对象

Attr attr = node.getAttributeNode("name");

//获取属性节点的值是否给指定的节点属性值相同

if (attr.getNodeValue().equals(value)) {

//返回此节点

return node;

}

}

return null;

}

/**

* 根据id获取某个节点对象

*

* @param document

* @param id

* @return

*/

public Node findNodeById(Document document, String id) {

return document.getElementById(id);

}

5.删除指定的节点对象

/**

* 删除某个节点对象

*

* @param document

* @param id

* @throws TransformerException

*/

public void deleteNodeById(Document document, String id)

throws TransformerException {

//获取删除的节点对象

Node node = document.getElementById(id);

// 是通过父节点调用removeChild(node)把子节点给删除掉

Node node1 = node.getParentNode().removeChild(node);

//创建TransformerFactory对象

TransformerFactory transformerFactory = TransformerFactory

.newInstance();

//Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出

//Transformer对象通过TransformerFactory获得

Transformer transformer = transformerFactory.newTransformer();

// 把Document对象又重新写入到一个XML文件中。

transformer.transform(new DOMSource(document), new StreamResult(

new File("src//a.xml")));

}

6.更新某个节点对象

/**

* 更新某个节点

*

* @param document

* @param id

* @throws TransformerExceptihttp://on

*/

public void updateNodeById(Document document, String id)

throws TransformerException {

//根据id获取元素指定的元素节点对象

Element node = document.getElementById(id);

//获取元素节点的id属性节点对象

Attr attr = node.getAttributeNode("id");

//修改元素节点的属性值

attr.setValue("x122");

//获取该节点对象的所有孩子节点对象name、age、sex节点

NodeList nodelist = node.getChildNodes();

//遍历

for (int i = 0; i < nodelist.getLength(); i++) {

//得到具体的节点对象

Node n = nodelist.item(i);

//判断是否是元素节点对象

if (n.getNodeType() == Node.ELEMENT_NODE) {

//看是否是name节点

if (n.getNodeName().equals("name")) {

n.setTextContent("君君");//修改其值

} else if (n.getNodeName().equals("age")) {//看看是否是age节点

n.setTextContent("80");//修改其值

} else if (n.getNodeName().equals("sex")) {//看看是否是sex节点

n.setTextContent("男");//修改其值

} else {

System.out.println("不做处理");

}

}

}

//创建TransformerFactory对象

TransformerFactory transformerFactory = TransformerFactory

.newInstance();

//Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出

//Transformer对象通过TransformerFactory获得

Transformer transformer = transformerFactory.newTransformer();

//把Document对象又重新写入到一个XML文件中。

transformer.transform(new DOMSource(document), new StreamResult(

new File("src//b.xml")));

}

7.在某个节点的下方添加新的节点

/**

* 在指定的节点下方添加新得某个节点

*

* @param document

* @param id

* @throws TransformerException

*/

public void addNodeById(Document document, String id)

throws TransformerException {

//获取要添加位置节点的兄弟节点对象

Element node = document.getElementById(id);

//获取其父节点对象

Node parentNode = node.getParentNode();

//创建元素节点

Element nd = document.createElement("student");

//设置元素节点的属性值

nd.setAttribute("id", "x123");

//创建name元素节点

Node name = document.createElement("name");

//设置name节点的文本值

name.appendChild(document.createTextNode("陈红军"));

//创建age元素节点

Node age = document.createElement("age");

//设置age节点的文本值

age.appendChild(document.createTextNode("20"));

//创建sex元素节点

Node sex = document.createElement("sex");

//设置sex节点的文本值

sex.appendChild(document.createTextNode("男"));

//在nd节点中添加3个子节点

nd.appendChild(name);

nd.appendChild(age);

nd.appendChild(sex);

//在父节点中添加nd节点

parentNode.appendChild(nd);

//创建TransformerFactory对象

TransformerFactory transformerFactory = TransformerFactory

.newInstance();

//Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出

//Transformer对象通过TransformerFactory获得

Transformer transformer = transformerFactory.newTransformer();

//把Document对象又重新写入到一个XML文件中。

transformer.transform(new DOMSource(document), new StreamResult(

new File("src//c.xml")));

}

通过以上方法的练习希望你对xml的DOM解析有个入门的了解.

总结

以上所述是给大家介绍的使用jaxp进行dom解析_,希望对大家有所帮助,如果大家有任何疑问请给我留言,会及时回复大家的。在此也非常感谢大家对我们网站的支持!

//获取具体的某个属性节点

Attr attr = (Attr) namenm.item(k);

System.out.println("name:::"+attr.getNodeName()+" value::"

+attr.getNodeValue()+" type::"+attr.getNodeType());

}

}

//获取元素节点的所有孩子节点

NodeList listnode = element.getChildNodes();

//遍历

for (int j = 0; j < listnode.getLength(); j++) {

//得到某个具体的节点对象

Node nd = listnode.item(j);

System.out.println("name::" + nd.getNodeName() + " value:::"

+ nd.getNodeValue() + " type:::" + nd.getNodeType());

//重新调用遍历节点的操作的方法

listNodes(nd);

}

}

}

4.查询某个节点对象(简单列举一些案例)

/**

* 根据标签的名称查找所有该名称的节点对象

*/

public void findNode(Document document) {

//根据标签名称获取该名称的所有节点对象

NodeList nodelist = document.getElementsByTagName("teacher");

//遍历

for (int i = 0; i < nodelist.getLength(); i++) {

//得到具体的某个节点对象

Node node = nodelist.item(i);

System.out.println(node.ghttp://etNodeName());

}

}

/**

* 根据属性的值 查询某个节点对象

* 属性值是唯一(假设)

* @param document

* @param value

* @return

*/

public Node findNodeByAttrValue(Document document, String value) {

//根据标签名称获取该名称的节点对象集合

NodeList nodelist = document.getElementsByTagName("teacher");

//遍历

for (int i = 0; i < nodelist.getLength(); i++) {

//获取某个具体的元素节点对象

Element node = (Element) nodelist.item(i);

//根据属性名称获取该节点的属性节点对象

Attr attr = node.getAttributeNode("name");

//获取属性节点的值是否给指定的节点属性值相同

if (attr.getNodeValue().equals(value)) {

//返回此节点

return node;

}

}

return null;

}

/**

* 根据id获取某个节点对象

*

* @param document

* @param id

* @return

*/

public Node findNodeById(Document document, String id) {

return document.getElementById(id);

}

5.删除指定的节点对象

/**

* 删除某个节点对象

*

* @param document

* @param id

* @throws TransformerException

*/

public void deleteNodeById(Document document, String id)

throws TransformerException {

//获取删除的节点对象

Node node = document.getElementById(id);

// 是通过父节点调用removeChild(node)把子节点给删除掉

Node node1 = node.getParentNode().removeChild(node);

//创建TransformerFactory对象

TransformerFactory transformerFactory = TransformerFactory

.newInstance();

//Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出

//Transformer对象通过TransformerFactory获得

Transformer transformer = transformerFactory.newTransformer();

// 把Document对象又重新写入到一个XML文件中。

transformer.transform(new DOMSource(document), new StreamResult(

new File("src//a.xml")));

}

6.更新某个节点对象

/**

* 更新某个节点

*

* @param document

* @param id

* @throws TransformerExceptihttp://on

*/

public void updateNodeById(Document document, String id)

throws TransformerException {

//根据id获取元素指定的元素节点对象

Element node = document.getElementById(id);

//获取元素节点的id属性节点对象

Attr attr = node.getAttributeNode("id");

//修改元素节点的属性值

attr.setValue("x122");

//获取该节点对象的所有孩子节点对象name、age、sex节点

NodeList nodelist = node.getChildNodes();

//遍历

for (int i = 0; i < nodelist.getLength(); i++) {

//得到具体的节点对象

Node n = nodelist.item(i);

//判断是否是元素节点对象

if (n.getNodeType() == Node.ELEMENT_NODE) {

//看是否是name节点

if (n.getNodeName().equals("name")) {

n.setTextContent("君君");//修改其值

} else if (n.getNodeName().equals("age")) {//看看是否是age节点

n.setTextContent("80");//修改其值

} else if (n.getNodeName().equals("sex")) {//看看是否是sex节点

n.setTextContent("男");//修改其值

} else {

System.out.println("不做处理");

}

}

}

//创建TransformerFactory对象

TransformerFactory transformerFactory = TransformerFactory

.newInstance();

//Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出

//Transformer对象通过TransformerFactory获得

Transformer transformer = transformerFactory.newTransformer();

//把Document对象又重新写入到一个XML文件中。

transformer.transform(new DOMSource(document), new StreamResult(

new File("src//b.xml")));

}

7.在某个节点的下方添加新的节点

/**

* 在指定的节点下方添加新得某个节点

*

* @param document

* @param id

* @throws TransformerException

*/

public void addNodeById(Document document, String id)

throws TransformerException {

//获取要添加位置节点的兄弟节点对象

Element node = document.getElementById(id);

//获取其父节点对象

Node parentNode = node.getParentNode();

//创建元素节点

Element nd = document.createElement("student");

//设置元素节点的属性值

nd.setAttribute("id", "x123");

//创建name元素节点

Node name = document.createElement("name");

//设置name节点的文本值

name.appendChild(document.createTextNode("陈红军"));

//创建age元素节点

Node age = document.createElement("age");

//设置age节点的文本值

age.appendChild(document.createTextNode("20"));

//创建sex元素节点

Node sex = document.createElement("sex");

//设置sex节点的文本值

sex.appendChild(document.createTextNode("男"));

//在nd节点中添加3个子节点

nd.appendChild(name);

nd.appendChild(age);

nd.appendChild(sex);

//在父节点中添加nd节点

parentNode.appendChild(nd);

//创建TransformerFactory对象

TransformerFactory transformerFactory = TransformerFactory

.newInstance();

//Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出

//Transformer对象通过TransformerFactory获得

Transformer transformer = transformerFactory.newTransformer();

//把Document对象又重新写入到一个XML文件中。

transformer.transform(new DOMSource(document), new StreamResult(

new File("src//c.xml")));

}

通过以上方法的练习希望你对xml的DOM解析有个入门的了解.

总结

以上所述是给大家介绍的使用jaxp进行dom解析_,希望对大家有所帮助,如果大家有任何疑问请给我留言,会及时回复大家的。在此也非常感谢大家对我们网站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Druid基本配置及内置监控使用_动力节点Java学院整理
下一篇:Spring Boot与Docker部署详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~