四 问答
1)Scanna命名空间各个代表的意思
1.xmlns=".."片段的作用是什么?
通过名称空间声明xmlns来声明当前编写的标签来自哪个Schema约束文档
2.xmlns:xsi=".."片段的作用是什么?
声明表示schemaLocation属性时所使用的名称空间(即为前缀)
3.xsi:schemaLocation=".."片段的作用是什么?
为了在XML文档中声明它所遵循的Schema文件的具体位置
4.那些名称空间所对应的XML Schema文档的位置不用显示指定,为什么?
在使用schemaLocation属性时,需要指定该属性来自哪里,需要使用的命名空间所对应的xml schema文档的位置不用显示指定。 原因 :它是一个w3c的名称空间,xml文件和schema模式文档都 遵循的是w3c的标准。
1.解析方式有集中
XML解析方式分为两种:dom和sax
dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。
sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。
区别:
SAX:边加载边解析,解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系增删改查
DOM:,需要读取整个 XML 文档,如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。只能进行查询
2.约束几种,区别
Schema DTD:
XML Schema符合XML语法结构。
DOM、SAX等XML API很容易解析出XML Schema文档中的内容。
XML Schema对名称空间支持得非常好。
XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。
XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。
public class Demo2 {
//遍历所有的节点 read
@Test
public void read() throws ParserConfigurationException, SAXException, IOException{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document document = db.parse("src/book.xml");
//得到根节点
Node root=document.getElementsByTagName("书架").item(0);
list(root);
}
private void list(Node node) {
if(node instanceof Element){
System.out.println(node.getNodeName());
}
NodeList list=node.getChildNodes();
for(int i=0;i<list.getLength();i++){
Node child=list.item(i);
list(child);
}
}
//读取属性的值
@Test
public void read1() throws ParserConfigurationException, SAXException, IOException{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document document = db.parse("src/book.xml");
Element node=(Element) document.getElementsByTagName("书名").item(0);
String value=node.getAttribute("id");
System.out.println(value);
}
//添加节点
@Test
public void insert() throws ParserConfigurationException, SAXException, IOException, TransformerException{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document document = db.parse("src/book.xml");
//创建节点
Element element = document.createElement("优惠价");
element.setTextContent("29元");
//把创建出来的节点添加到第一本书上
Element book=(Element) document.getElementsByTagName("书").item(0);
book.appendChild(element);
//把添加的节点写的xml文件中
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
}
//在指定位置添加节点
@Test
public void insert1() throws ParserConfigurationException, SAXException, IOException, TransformerException{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document document = db.parse("src/book.xml");
//创建节点
Element element = document.createElement("优惠价");
element.setTextContent("29元");
//获取参考节点
Element price=(Element) document.getElementsByTagName("售价").item(0);
//把创建出来的节点添加到第一本书上
Element book=(Element) document.getElementsByTagName("书").item(0);
book.insertBefore(element, price);
//把添加的节点写的xml文件中
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
}
//删除节点
@Test
public void delete() throws ParserConfigurationException, SAXException, IOException, TransformerException{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document document = db.parse("src/book.xml");
//获取要删除的节点
Element e=(Element) document.getElementsByTagName("售价").item(0);
//获取到要删除节点的父节点
//Element parent=(Element) e.getParentNode();
//parent.removeChild(e);
e.getParentNode().getParentNode().removeChild(e.getParentNode());
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
}
//更新
@Test
public void update() throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document document = db.parse("src/book.xml");
//获取要更新的节点
Element e=(Element) document.getElementsByTagName("售价").item(0);
e.setTextContent("38元");
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
}
}