package com.test;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
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;
/**
* @author:
* @date :Created in 2020/9/12
* @description :
* @version: 1.0
*/
public class GetXmlAttribute {
public static void main(String[] args) {
String xmlString = "<tbody>" +
"<tr><th width='37' align='right'>姓名:</th>" +
"<td width='63%' align='left'>积极</td></tr>" +
"<tr><th width='37' align='right'>身份证号:</th>" +
"<td width='63%' align='left'>110102198506029733</td></tr>" +
"</tbody>";
GetXmlAttribute t = new GetXmlAttribute();
// 将String字符串转换为xml
StringBuilder sXML = new StringBuilder();
sXML.append(xmlString);
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputStream is = new ByteArrayInputStream(sXML.toString().getBytes("utf-8"));
Document document = builder.parse(is);
is.close();
// 得到根元素
Element root = document.getDocumentElement();
// 得到<th>节点列表
NodeList nodeList = root.getElementsByTagName("th");
for (int k = 0; k < nodeList.getLength(); k++) {
Node node = nodeList.item(k);
// 如果元素为元素节点
if (node.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(node.getNextSibling());
// 将节点强转为元素
Element elementNode = (Element) node;
// 得到当前元素的值
String str = elementNode.getTextContent();
if (str.equals("姓名:")) {
// 得到当前元素节点的下一个节点
Node nextNode = node.getNextSibling();
// 如果当前元素的下一个节点为元素节点
if (nextNode.getNodeType() == Node.ELEMENT_NODE) {
// 得到元素节点的值
String nodeValue = nextNode.getTextContent();
// 修改元素节点的值
nextNode.setTextContent(nodeValue + "学习");
}
String nextNodeValue = nextNode.getTextContent();
System.out.println(nextNodeValue);
}
}
}
//将document对象转换为String类型
DOMSource domSource = new DOMSource(document);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
TransformerFactory tf=TransformerFactory.newInstance();
Transformer transformer;
transformer = tf.newTransformer();
transformer.transform(domSource, result);
System.out.println(writer.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
/* public static Document StringToXML(String str){
StringBuilder sXML = new StringBuilder();
sXML.append(str);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
Document doc=null;
try {
InputStream is = new ByteArrayInputStream(sXML.toString().getBytes("utf-8"));
doc = dbf.newDocumentBuilder().parse(is);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return doc;
}*/
}
在工作中遇到了这样的一个问题,有一个Map类型中存了像代码中一样的字符,需求就是类似于把指定姓名的修改或者把身份证号进行出身年月的隐藏,所以就写了这个测试类,下面注释掉的是把String类型转换成XML的抽取方法,后来为了写到项目中方便注释掉了,如果有更好的处理方法欢迎指教,一起进步,共勉.