Java XML存储
遵循原则:元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。
XML与操作系统无关,与编程语言无关,可以实现不同系统之间的数据交换
XML文档内容由一系列标签元素组成
<标签名 属性名="属性值"></标签名>
<元素名 属性名="属性值">元素内容</元素名>
---属性值中不能直接包含<、“、&(不建议 '、>)
所有XML元素都必须由结束标签,大小写敏感,正确的嵌套
XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。
XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新应用程序或新的浏览器
如果信息感觉起来很像数据,那么请使用子元素。
避免 XML 属性?
因使用属性而引起的一些问题:
属性无法包含多重的值(元素可以)
属性无法描述树结构(元素可以)
属性不易扩展(为未来的变化)
属性难以阅读和维护
请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息。
元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。
XML 属性必须加引号
子元素可以重名!
通过 DTD 验证的 XML 是“合法”的 XML。
DOM
——文档对象模型,document object module 9
——节点:XML当中所有的内容都可以称为节点node
——元素节点:#element,就是xml当中的标签 1
——属性节点:#Attribute,有值的(value) 2
——文本节点:#text,有值的(value)
——注释节点:
**CDATA正常节点方式读
应用领域:数据交互、 配置应用程序和网站、 Ajax基石
解析技术:
JDK:操作节点方便,读写繁琐
---三方jar包
SAX:操作节点繁琐,读写方便
DOM4J:操作、读写方便;性能高!!非web工程的情况:
桌面应用swing
第三方应用
一些功能单一的中转站
导入dom4j的jar包,生成Referenced Libraries
获取路径的两种方式:
//1.从src往后找,如果找不到返回null
pathString1 = ReadDemo.class.getClassLoader().getResource("demo.xml").getPath();//2.从src往后找,如果找不到返回null
String pathString1 = ReadDemo.class.getResource("/demo.xml").getPath();
读取XML文档
//开始解析
//1.获取解析器
SAXReader reader = new SAXReader();
String pathString = ReadDemo.class.getClassLoader()
.getResource("book.xml").getPath();
System.out.println("book.xml path:"+pathString);
//2.获取文档
//reader.read(arg0)
Document document = reader.read(new FileInputStream(new File(pathString)));
System.out.print("document type:"+document.getNodeType()+"\t");
System.out.println(document.getNodeTypeName());
//3.获取根目录
Element rootEle = document.getRootElement();
System.out.print("rootEle type:"+rootEle.getNodeType()+"\t");
System.out.print(rootEle.getNodeTypeName()+"\t");
System.out.println(rootEle.getName());
//4.获取子元素
rootEle.element("book");//根据节点名获取第一个该名称的节点
rootEle.elements();//获取所有子标签
rootEle.elements("book");//所有该名称的子标签//获取属性值以及子元素内容
List<Element>bookList = rootEle.elements("book");
for (Element book : bookList) {
Attribute attribute = book.attribute("id");
System.out.print("id attributes:"+attribute.getNodeType()+"\t");
System.out.print(attribute.getNodeTypeName()+"\t");
System.out.print(attribute.getName()+"\t");
System.out.println(attribute.getValue());
/*
* 方法2
* String idString = book.attributeValue("id"); System.out.println(idString);
*/
List<Element> bookChildEle = book.elements();
for (Element element : bookChildEle) {
System.out.print("bookChild element:"+element.getName()+"\t");
//System.out.println(element.getText()+"\t");//不去除空格的文本内容,多个空格为一个
System.out.println(element.getTextTrim());//去除空格的文本内容
}
}//写文档
Document document = DocumentHelper.createDocument();
Element books = document.addElement("books");
Element book = books.addElement("book");
Element book1 = books.addElement("book");//简单添加元素
book.addAttribute("id", "bk001");
book.addCDATA("test word1");
book1.addAttribute("id", "bk002");
book1.addCDATA("test word2");//添加内容
newBookElement.setText("JVM 原理");
//格式化
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
//写入文件
String pathString = ReadDemo.class.getResource("").getPath();
// System.out.println("当前路径:"+pathString);
XMLWriter writer = new XMLWriter(new FileOutputStream(new File(pathString,"booksWrite.xml")), format);
writer.write(document);
writer.close();
System.out.println("success to write....");【注意:如果是使用eclipse等继承开发工具查看,注意刷新当前文件夹,才能看到!】
XMLHttpRequest 对象用于在后台与服务器交换数据。
在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签。
所有元素都必须彼此正确地嵌套
必须有一个元素是所有其他元素的父元素
XML 的属性值须加引号。
【
如果属性值本身包含双引号,那么有必要使用单引号包围它:
ex:
<gangster name='George "Shotgun" Ziegler'><gangster name="George "Shotgun" Ziegler">】
XML 文档经常有一个对应的数据库,其中的字段会对应 XML 文档中的元素。有一个实用的经验,即使用数据库的名称规则来命名 XML 文档中的元素。
优势:
1.XML 的优势之一,就是可以经常在不中断应用程序的情况进行扩展。
使用属性而引起的一些问题:
- 属性无法包含多重的值(元素可以)
- 属性无法描述树结构(元素可以)
- 属性不易扩展(为未来的变化)
- 属性难以阅读和维护
请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息。
从src往后获取路径:
ClassName.getResource("/file.txt").getPath()
ClassName.getClassLoader().getResource("file.txt").getPath()