用domw3c dom 解析xmll,所有的xml解析都出現,请求帮助

随笔 - 35, 文章 - 0, 评论 - 255, 引用 - 0
,是W3C组织推荐的处理可扩展标志语言的标准编程接口。html,xml都是基于这个模型构造的。这也是一个W3C推出的标准。java,python,javascript等语言都提供了一套基于dom的编程接口。
java使用dom解析xml
一段xml文档, note.xml:
&?xml version=&1.0& encoding=&UTF-8&?&
&to id=&1&&George&/to&
&from&John&/from&
&heading&Reminder&/heading&
&body&Don't forget the meeting!&/body&
我们先使用w3c dom解析该xml:
public void test() {
NodeList nodeList = doc.getChildNodes().item(0).getChildNodes();
System.out.println(&xml size: & + nodeList.getLength());
for(int i = 0; i & nodeList.getLength(); i ++) {
Node node = nodeList.item(i);
System.out.println(node.getNodeType());
System.out.println(node.getNodeName());
xml size: 9
我们看到代码输出note节点的字节点的时候,有9个节点,但是xml文档中note节点实际上只有to、from、heading、body4个节点。 那为什么是9个呢,原因是这样的。
选取几个w3c规范中关于节点类型的描述:
表示整个文档(DOM 树的根节点)
Element(max. one),Comment,DocumentType
表示 element(元素)元素
element name
Text,Comment,CDATASection
表示元素或属性中的文本内容。
CDATASection
表示文档中的 CDATA 区段(文本不会被解析器解析)
#cdata-section
更多细节请查看
下面解释一下文档节点的字节点的处理过程:
其中红色部分为Text节点,紫色部分是Element节点(只画了部分)。&/body&后面的也是一个Element节点,所有4个Element节点,5个Text节点。
所以输出的内容中3 #text表示该节点是个Text节点,1 节点name是个Element节点,这与表格中表述的是一样的。
测试代码:
public void test1() {
NodeList nodeList = doc.getChildNodes().item(0).getChildNodes();
System.out.println(&xml size: & + nodeList.getLength());
for(int i = 0; i & nodeList.getLength(); i ++) {
Node node = nodeList.item(i);
if(node.getNodeType() == Node.TEXT_NODE) {
System.out.println(node.getNodeValue().replace(&\n&,&hr&).replace(' ', '-'));
很明显,我们把空格和回车键替换打印后发现我们的结论是正确的。
测试代码:
public void test2() {
System.out.println(&doc type: & + doc.getNodeType());
NodeList nodeList = doc.getChildNodes().item(0).getChildNodes();
Node secondNode = nodeList.item(1);
System.out.println(&element [to] node type: & + secondNode.getNodeType());
System.out.println(&element [to] node name: & + secondNode.getNodeName());
System.out.println(&element [to] node value: & + secondNode.getNodeValue());
System.out.println(&element [to] children len: & + secondNode.getChildNodes().getLength());
System.out.println(&element [to] children node type: & + secondNode.getChildNodes().item(0).getNodeType());
System.out.println(&element [to] children node value: & + secondNode.getChildNodes().item(0).getNodeValue());
System.out.println(&element [to] children node name: & + secondNode.getChildNodes().item(0).getNodeName());
Node attNode = secondNode.getAttributes().item(0);
System.out.println(&attr type: & + attNode.getNodeType());
输出结果跟表格中是一样的。
大家有兴趣的话其他类型的节点比如CDATA节点大家可以自行测试~
javascript使用dom解析html
html代码:
&!DOCTYPE html&
&meta charset=&utf-8&&
&title&JS Bin&/title&
&p&gogogo&/p&
console.log(document.nodeType);
var div = document.getElementsByTagName(&div&)[0]; //9
console.log(div.nodeType); //1
for(var i = 0;i & div.childNodes. i ++) {
console.log(div.childNodes[i].nodeType);
分别输出9,1,3,1,3
跟我们在表格中对应~
本次博客主要讲解了dom解析xml和html。 以前使用java解析xml的时候总是使用一些第三方库,比如jdom。 但是dom却是w3c的规范,不止java,包括javascript,python这些主流语言也都主持,有了规范,语言只是实现了这些规范而已。解析 XML DOM
解析 XML DOM
大多数浏览器都内建了供读取和操作 XML 的 XML 解析器。
解析器把 XML 转换为 JavaScript 可存取的对象。
W3School 提供的实例独立于浏览器和平台。这些实例可在所有现代浏览器中运行。
所有现代浏览器都内建了用于读取和操作 XML 的 XML 解析器。
解析器把 XML 读入内存,并把它转换为可被 JavaScript 访问的 XML DOM 对象。
微软的 XML 解析器与其他浏览器中的解析器是有差异的。微软的解析器支持对 XML 文件和 XML 字符串(文本)的加载,而其他浏览器使用单独的解析器。不过,所有的解析器都含有遍历 XML 树、访问、插入及删除节点的函数。
在本教程中,我们将为您讲解如何创建可在 IE 及其他浏览器中运行的脚本。
通过微软的 XML 解析器加载 XML
微软的 XML 解析器内建于 Internet Explorer 5 及更高版本中。
下面的 JavaScript 片段把 XML 文档 (&&) 载入了解析器:
xmlDoc=new ActiveXObject(&Microsoft.XMLDOM&);
xmlDoc.async=&false&;
xmlDoc.load(&books.xml&);
代码解释:
第一行创建空的微软 XML 文档对象
第二行关闭异步加载,这样可确保在文档完整加载之前,解析器不会继续执行脚本
第三行告知解析器加载名为 &books.xml& 的文档
下面的 JavaScript 片段把名为 txt 的字符串载入解析器中:
xmlDoc=new ActiveXObject(&Microsoft.XMLDOM&);
xmlDoc.async=&false&;
xmlDoc.loadXML(txt);
注释:loadXML() 方法用于加载字符串(文本),而 load() 用于加载文件。
在 Firefox 及其他浏览器中的 XML 解析器
下面的 JavaScript 片段把 XML 文档 (&&) 载入了解析器:
xmlDoc=document.implementation.createDocument(&&,&&,null);
xmlDoc.async=&false&;
xmlDoc.load(&books.xml&);
代码解释:
第一行创建空的 XML 文档对象
第二行关闭异步加载,这样可确保在文档完整加载之前,解析器不会继续执行脚本
第三行告知解析器加载名为 &books.xml& 的文档
下面的 JavaScript 片段把名为 txt 的字符串载入解析器中:
parser=new DOMParser();
xmlDoc=parser.parseFromString(txt,&text/xml&);
代码解释:
第一行创建一个空的 XML 文档对象
第二行告知解析器加载名为 txt 的字符串
注释:Internet Explorer 使用 loadXML() 方法来解析 XML 字符串,而其他浏览器使用 DOMParser 对象。
解析 XML 文件 - 一个跨浏览器的实例
下面的例子把 XML 文档 (&&) 载入 XML 解析器:
&script type=&text/javascript&&
try //Internet Explorer
xmlDoc=new ActiveXObject(&Microsoft.XMLDOM&);
try //Firefox, Mozilla, Opera, etc.
xmlDoc=document.implementation.createDocument(&&,&&,null);
catch(e) {alert(e.message)}
xmlDoc.async=
xmlDoc.load(&books.xml&);
document.write(&xmlDoc is loaded, ready for use&);
catch(e) {alert(e.message)}
Error: Access Across Domains
出于安全方面的原因,现代的浏览器不允许跨域的访问。
这意味着,网页以及它试图加载的 XML 文件,都必须位于相同的服务器上。
W3School 的实例所打开的 XML 文件位于 W3School 的域上。
假如你打算在自己的网页上使用上面的例子,则必须把 XML 文件放到自己的服务器上。否则,xmlDoc.load() 将产生错误 &Access is denied&。
解析 XML 字符串 - 一个跨浏览器的实例
下面的代码加载并解析了一个 XML 字符串:
&script type=&text/javascript&&
text=&&bookstore&&
text=text+&&book&&;
text=text+&&title&Harry Potter&/title&&;
text=text+&&author&J K. Rowling&/author&&;
text=text+&&year&2005&/year&&;
text=text+&&/book&&;
text=text+&&/bookstore&&;
try //Internet Explorer
xmlDoc=new ActiveXObject(&Microsoft.XMLDOM&);
xmlDoc.async=&false&;
xmlDoc.loadXML(text);
try //Firefox, Mozilla, Opera, etc.
parser=new DOMParser();
xmlDoc=parser.parseFromString(text,&text/xml&);
catch(e) {alert(e.message)}
document.write(&xmlDoc is loaded, ready for use&);
注释:Internet Explorer 使用 loadXML() 方法来解析 XML 字符串,而其他浏览器使用 。13350人阅读
android_数据增删查改(9)
好吧,我们还是来实现这张图的效果,只不过技术我们改为了dom,至于这里的图片上为什么显示的是sax解析,我只能说,哎,没办法,我想偷懒啊。嘿嘿&&再看代码结构图:
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/textView"
&/LinearLayout&
beauties.xml
&?xml version="1.0" encoding="UTF-8"?&
&beauties&
&name&林志玲&/name&
&age&28&/age&
&name&杨幂&/name&
&age&23&/age&
&/beauties&
activity的代码:
import java.io.InputS
import java.util.ArrayL
import javax.xml.parsers.DocumentB
import javax.xml.parsers.DocumentBuilderF
import org.w3c.dom.D
import org.w3c.dom.E
import org.w3c.dom.N
import org.w3c.dom.NodeL
import android.app.A
import android.os.B
import android.util.L
import android.widget.TextV
* @author chenzheng_java
* @description 使用dom解析xml
public class DomParseXmlTest extends Activity {
// 存储最终在前台显示的内容
private String result = "";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
InputStream inputStream = this.getClassLoader().getResourceAsStream(
"beauties.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(inputStream);
// 获取根节点
Element root = document.getDocumentElement();
parse(root);
for (Beauty b : beautyList) {
result += b.toString();
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(result);
} catch (Exception e) {
e.printStackTrace();
private Beauty beauty =
private ArrayList&Beauty& beautyList = new ArrayList&Beauty&();
* @param element 将要进行遍历的节点
private void parse(Element element) {
NodeList nodelist = element.getChildNodes();
int size = nodelist.getLength();
for (int i = 0; i & i++) {
// 获取特定位置的node
Node element2 = (Node) nodelist.item(i);
/* getNodeName获取tagName,例如&book&thinking in android&/book&这个Element的getNodeName返回book
* getNodeType返回当前节点的确切类型,如Element、Attr、Text等
* getNodeValue 返回节点内容,如果当前为Text节点,则返回文本内容;否则会返回null
* getTextContent 返回当前节点以及其子代节点的文本字符串,这些字符串会拼成一个字符串给用户返回。例如
* 对&book&&name&thinking in android&/name&&price&12.23&/price&&/book&调用此方法,则会返回&thinking in android12.23&
String tagName = element2.getNodeName();
if (tagName.equals("beauty")
&& element2.getNodeType() == Document.ELEMENT_NODE) {
beauty = new Beauty();
Log.i("通知:", "创建beauty");
if (element2.getNodeType() == Document.ELEMENT_NODE) {
parse((Element) element2);
Log.i("通知:", "添加beauty");
beautyList.add(beauty);
if (tagName.equals("name")) {
String name = element2.getTextContent();
Log.i("通知:", "name" + name);
beauty.setName(name);
if (tagName.equals("age")) {
String age = element2.getTextContent();
Log.i("通知:", "age" + age);
beauty.setAge(age);
* @author chenzheng_java 这里使用内部类是为了效率考虑,内部类要比单独顶一个bean类更加的高效以及节约空间
private class Beauty {
public String getName() {
public void setName(String name) {
this.name =
public String getAge() {
public void setAge(String age) {
this.age =
public String toString() {
return "美女资料 [年龄=" + age + ", 姓名=" + name + "]";
其他都为默认。执行,然后就可以看到正确的结果了
----------------------------------------------------------------------------------
写博客的时候,不总结几句废话的孩子不是好孩子。所以,我决定还是说几句:
DOM解析虽然我们在android中并不推荐使用,但是这并不代表着不可以实现。dom的原理是把xml文件的各种部分都看成是节点,所有的节点因为层级关系最后形成了一颗节点树。而DOM的解析方式便是在内存中生存这棵树,并允许用户进行相关的操作。
&&&&& 这里列出几个dom中经常用到的方法
Node 接口的常用方法一个节点可以调用short getNodeType()方法返回一个表示节点类型的常量(Node接口规定的常量值),例如,对于Element节点,getNodeType()方法返回的值为:Node.ELEMENT_NODE节点可以调用NodeList& getChildNodes()返回一个由当前节点的所有子节点组成的NodeList对象。节点调用Node& getFirstChild()返回当前节点的第一个子节点。节点调用Node& getLastChild()返回当前节点的最后一个子节点。节点可以调用NodeList& getTextContent()返回当前节点及所有子孙节点中的文本内容。
还有其他的很多很多方法,我们可以通过api来详细了解。因为这里主要是为了学习android,所以关于dom稍微了解下就可以了。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1265016次
积分:10685
积分:10685
排名:第1560名
原创:105篇
转载:11篇
评论:353条
(1)(1)(1)(1)(4)(1)(83)(24)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 android dom解析xml 的文章

 

随机推荐