xml DOM
XML DOM (XML Document Object Model) 定义了访问和操作 XML 文档的标准方法。
DOM 把 XML 文档作为树结构来查看。能够通过 DOM 树来访问所有元素。可以修改或删除它们的内容,并创建新的元素。元素,它们的文本,以及它们的属性,都被认为是节点。
1 DOM 是这样规定的:
?整个文档是一个文档节点
?每个 XML 标签是一个元素节点
?包含在 XML 元素中的文本是文本节点
?每一个 XML 属性是一个属性节点
?注释属于注释节点
解析方式
1 大多数浏览器都内建了供读取和操作 XML 的 XML 解析器。
解析器把 XML 转换为 JavaScript 可存取的对象。
####文件加载
function loadXMLDoc(dname)
{
try //Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
}
catch(e)
{
try //Firefox, Mozilla, Opera, etc.
{
xmlDoc=document.implementation.createDocument("","",null);
}
catch(e) {alert(e.message)}
}
try
{
xmlDoc.async=false;
xmlDoc.load(dname);
return(xmlDoc);
}
catch(e) {alert(e.message)}
return(null);
}
####字符串加载
function loadXMLDoc(dname)
{
try //Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(text);
}
catch(e)
{
try //Firefox, Mozilla, Opera, etc.
{
parser=new DOMParser();
xmlDoc=parser.parseFromString(text,"text/xml");
}
catch(e) {alert(e.message)}
}
try
{
document.write("xmlDoc 已加载,可以使用。");
return(xmlDoc);
}
catch(e) {alert(e.message)}
}
#####可以使用xml dom的方法进行访问编辑节点
一些典型的 DOM 属性:
?x.nodeName - x 的名称
?x.nodeValue - x 的值
?x.parentNode - x 的父节点
?x.childNodes - x 的子节点
?x.attributes - x 的属性节点
XML DOM 方法
?x.getElementsByTagName(name) - 获取带有指定标签名称的所有元素
?x.appendChild(node) - 向 x 插入子节点
?x.removeChild(node) - 从 x 删除子节点
比如:
txt=xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue
2 java端解析
private Document document;
public void createXml(String fileName)
{
Element root = this.document.createElement("employees");
this.document.appendChild(root);//元素的内部后面添加节点
Element employee = this.document.createElement("employee");
Element name = this.document.createElement("name");
name.appendChild(this.document.createTextNode("丁宏亮"));
employee.appendChild(name);
Element sex = this.document.createElement("sex");
sex.appendChild(this.document.createTextNode("m"));
employee.appendChild(sex);
Element age = this.document.createElement("age");
age.appendChild(this.document.createTextNode("30"));
employee.appendChild(age);
root.appendChild(employee);
TransformerFactory tf = TransformerFactory.newInstance(); //建立一个TransformerFactory对象
try {
Transformer transformer = tf.newTransformer(); //调用newTransformer()方法得到一个Transformer对象
DOMSource source = new DOMSource(document); //将要变换的document对象封装到DOMSouce对象里。
transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
StreamResult result = new StreamResult(pw); //再将要生成的XML的文件封装到StreamReasult对象里。
transformer.transform(source, result); //用Transformer的Transformer方法,就可以生成XML文件了
System.out.println("生成XML文件成功!");
} catch (TransformerConfigurationException e)
{ System.out.println(e.getMessage()); }
catch (IllegalArgumentException e) { System.out.println(e.getMessage()); }
catch (FileNotFoundException e) { System.out.println(e.getMessage()); }
catch (TransformerException e) { System.out.println(e.getMessage()); }
}
public void parserXml(String fileName)
{
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(fileName);
NodeList employees = document.getChildNodes();
for (int i = 0; i < employees.getLength(); i++)
{
Node employee = employees.item(i);
NodeList employeeInfo = employee.getChildNodes();
for (int j = 0; j < employeeInfo.getLength(); j++)
{
Node node = employeeInfo.item(j);
NodeList employeeMeta = node.getChildNodes();
for (int k = 0; k < employeeMeta.getLength(); k++)
{
System.out.println(employeeMeta.item(k).getNodeName() + ":" + employeeMeta.item(k).getTextContent());
}
}
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
主要用到element对象和node对象
Element 对象表示 XML 文档中的元素。由于元素对象也是一种节点,因此它可继承 Node 对象的属性和方法。
1 获取元素值
getElementsByTagName()方法返回拥有指定标签名的所有元素的 NodeList。document.getElementsByTagName(elementName);
如果用node的方法,那就是document.getChildNodes()(不需要知道标签名,可以解析文档)。都可以求得nodelist,然后转换为node,nodelist.item(i)。
getNodeName()(获得node的标签名),getTextContent()(获得值)
node转换为element
Node nd=nodelist.item(i);
if (Node.ELEMENT_NODE == nd.getNodeType())
{
element = (Element) nd;
return element;
}
2 获取元素属性
element.getAttribute("指定属性") - 获取指定属性的值
主要用这几个方法,还有其他的node方法和element方法也可以使用。
3 创建元素(从上往下,从里往外)
document.createElement(String tagName)(返回element)创建节点
document.createTextNode("丁宏亮")创建文本节点
element.setAttribute("age", "22");
el1.appendChild(el2)。在el1节点已有节点的后面的后面添加el2,el1是el2的父节点