Ajax
Ajax--XML
- XML简介
- xml文档
- 语法规则
- JavaScript 解析XML API
- 使用JAXB生成XML文档
- servlet中
- 注解
- 服务器返回xml代码
- Ajax接收返回的XML文档(script)
- XML的验证---DTD
XML简介
• XML 指可扩展标记语言(EXtensible Markup Language)
• XML 是一种标记语言,很类似 HTML
• XML 的设计宗旨是传输数据,而非显示数据
• XML 标签没有被预定义。您需要自行定义标签。
• XML 被设计为具有自我描述性。
• XML 是 W3C 的推荐标准
XML和HTML的差异:
• XML 不是 HTML 的替代。
• XML 和 HTML 为不同的目的而设计:
• XML 被设计为传输和存储数据,其焦点是数据的内容。
• HTML 被设计用来显示数据,其焦点是数据的外观。
• HTML 旨在显示信息,而 XML 旨在传输信息。
xml文档
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<book><author>罗伯特</author><bookname>杀死一只知更鸟</bookname><id>88</id><publisher>译林出版社</publisher>
</book>
语法规则
• 所有 XML 元素都须有关闭标签
• XML 标签对大小写敏感
• XML 必须正确地嵌套
• XML 文档必须有根元素
•XML 的属性值须加引号
• 元素名称不能以数字和"_"(下划线)开头、不能以XML开头、不能包含空格与冒号
•HTML中的转义符在XML中也可以使用,如果文本中需要转义的字符太多,还可以使用 “<![CDATA[ 需要转义的文本 ]]>”进行转义
JavaScript 解析XML API
| 名称/类型 | 作用 |
|---|---|
| getElementsByTagName(name)/方法 | 返回当前元素中有指定标记名的子元素数组 |
| childNodes/属性 | 返回当前元素所有子元素的数组 |
| nodeValue/字符串 | 获取节点值:如果节点为元素,返回null或 undefined;如果节点为文本,返回文本值 |
| getAttribute(name)/方法 | 返回元素的属性值,属性有name指定 |
使用JAXB生成XML文档
servlet中
BookService bookService = new BookService();List<Book> bookList = bookService.findAll();XmlBookList xmlBookList = new XmlBookList();xmlBookList.setBookList(bookList);JAXBContext ctx = null;try {ctx = JAXBContext.newInstance(XmlBookList.class);Marshaller marshaller = ctx.createMarshaller();//格式化输出marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);//输出中文编码marshaller.setProperty(Marshaller.JAXB_ENCODING,"GBK");marshaller.marshal(xmlBookList, resp.getOutputStream());} catch (JAXBException e) {e.printStackTrace();}
注解
@XmlRootElement
public class Book {}@XmlRootElement(name="bookList")
public class XmlBookList {private List<Book> bookList;public List<Book> getBookList(){return bookList;}@XmlElement(name="book")public void setBookList(List<Book> bookList){this.bookList = bookList;}
}@XmlAttribute public void setId(int id) { this.id = id; }
忽略属性
@XmlTransient public void setAddress(Address address) { this.address = address; }
服务器返回xml代码
response.setContentType("text/xml");PrintWriter out = response.getWriter();out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");out.println("<books>");out.println("<book ISBN=\"5197-5742-5657\">");out.println("<name>Java编程思想</name>");out.println("<price>91.5</price>");out.println("<authors>");out.println("<author>");out.println("<name>汤姆斯</name>");out.println("<nation>美国</nation>");out.println("</author>");out.println("<author>");out.println("<name>杰西姆</name>");out.println("<nation>美国</nation>");out.flush();out.close();
Ajax接收返回的XML文档(script)
单个对象:
/*** ajax请求回调函数*/function callback() {// alert(xmlHttp.readyState);//状态码 0-4if(xmlHttp.readyState == 4){if(xmlHttp.status == 200){var result = xmlHttp.responseXML;console.log(result);let book = result.getElementsByTagName("book")[0];let bookName = book.getElementsByTagName("bookname")[0].childNodes[0].nodeValue;let author = book.getElementsByTagName("author")[0].childNodes[0].nodeValue;let publisher = book.getElementsByTagName("publisher")[0].childNodes[0].nodeValue;let id = book.getElementsByTagName("id")[0].childNodes[0].nodeValue;let obj = {id: id,bookName: bookName,author: author,publisher: publisher}createHtml(obj);// var result = xmlHttp.responseText;//响应"添加成功"的文本// alert(result);}else {// alert(xmlHttp.status);alert("服务器升级中!")//除200之外的状态码}}}
一个集合:
function callback() {if (xmlHttp.readyState == 4) {if (xmlHttp.status == 200) {var xmlObj = xmlHttp.responseXML;let bookList = xmlObj.getElementsByTagName("book");for (var index in bookList) {let book = bookList[index];let bookName = book.getElementsByTagName("bookname")[0].childNodes[0].nodeValue;let author = book.getElementsByTagName("author")[0].childNodes[0].nodeValue;let publisher = book.getElementsByTagName("publisher")[0].childNodes[0].nodeValue;let id = book.getElementsByTagName("id")[0].childNodes[0].nodeValue;let obj = {id: id,bookName: bookName,author: author,publisher: publisher}createHtml(obj);}} else {alert("服务器升级中!");}}}
创建标签:
/*创建标签*/function createHtml(data) {let tr = document.createElement("tr");let idTd = document.createElement("td");let nameTd = document.createElement("td");let authorTd = document.createElement("td");let publTd = document.createElement("td");let textId = document.createTextNode(data.id);let textName = document.createTextNode(data.bookName);let textAuthor = document.createTextNode(data.author);let textPub = document.createTextNode(data.publisher);idTd.appendChild(textId);nameTd.appendChild(textName);authorTd.appendChild(textAuthor);publTd.appendChild(textPub);tr.appendChild(idTd);tr.appendChild(nameTd);tr.appendChild(authorTd);tr.appendChild(publTd);let tbody = document.querySelector("#tab");tbody.appendChild(tr);}
XML的验证—DTD
“*”代表子元素可以出现0到多次;
“+”代表子元素可以出现1到多次;
“?”代表子元素可以出现一次、也可以不出现; 如果没有修饰,代表子元素必须出现1次。


发布评论