【XML】4种解析器总结(DOM/SAX/JDDOM/DOM4J)

来源:互联网 发布:淘宝买东西货到付款 编辑:程序博客网 时间:2024/06/17 13:47
****************************************DOM解析器****************************************
1.指定解析对象
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();//创建解析对象
Doucment document=builder.parse(new File(“7-3.xml”));//指定解析对象文档
或Document doc=builder.newDocument();//创建生成xml文件
doc.setXmlVersion("1.0");
Comment comment=doc.createComment("创建xml文件");//声明或啥
document.appendChild(comment);//添加


2.获得节点
Element root=document.getDocumentElement();//获得元素//获得根元素,方法名中不涉及Root
NodeList nodeList=element.getChildNodes();//获得子元素


Element.getNodeName();//获得元素名
nodeList.item(i).getNodeType;//获得元素类型(比如是元素节点Node.ELEMENT_NODE或者文本节点Node.TEXT_NODE或其他)
element.item(i).getNodeValue();//也可获得文字内容
NamedNodeMap attr=element.getAttributes();//获得所有属性
attr.item(i).getNodeName();//获得属性名
attr.item(i).getNodeValue();//获得属性值
int r=nodeList.getLength();//获得孩子数量


3.插入节点
Element root=doc.getDocumentElement();
Element country=doc.createElement("country");//创建元素节点
Text country_text=doc.createTextNode("Spanish");//创建文本节点
country.appendChild(country_text);//添加文本节点,文本创建后仿照加上一元素节点
Attr age=doc.createAttribute("age");//创建属性节点
country.setAttribute(age.getNodeName(),"30";)//添加属性节点(前为名,后为值) 属性是自己创建,再与元素关联
root.appendChild(country);//添加子元素
element.insertBefore(new,old);//在指定字节点前插入新节点


4.删除节点
Element root=document.getDocumentElement();
Element member=(Element)root.getElementByTagName("Member").item(0);//获得指定子元素
Node text=member.getFirseChild();//获得指定孩子节点
member.removeChild(text);//移除孩子


5.文档生成:
TransformerFactory tff=TransformerFactory.newInstance();//将处理信息返回源文档,否则无法反映在XML文档
Transformer transformer=tff.newTransformer();
DOMSource domSource=new DOMSource(doc);
StreamResult sResult=new StreamResult(new File("src/Traversal.xml"));
transformer.transform(domSource,sResult);


****************************************SAX解析器****************************************
1.获取文档或创建解析工厂
XMLReader parser=XMLReaderFactory.createXMLReader();
ContentHandler cth=new c5_2();
parser.setContentHandler(cth);
parser.setProperty("http://xml.org/sax/properties/declaration-handler", cth);
parser.parse("H:/webfrawork/c5/src/c5/c5-2.xml");


或 SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser sparser=factory.newSAXParser();
sparser.parse(new File("src/c5/c5-1.xml"),new MyHandler());


2.首先继承
class MyHandler extends DefaultHandler{


3.继承后必写函数有
(继承class MyHandler extends DefaultHandler{)
public void startDocument() throws SAXException{
public void endDocument() throws SAXException{
public void startElement(String uri,String localName,String qName,Attributes attributes)throws SAXException{
public void endElement(String uri,String localName,String qName)throws SAXException{
public void characters(char[] ch,int start,int length)throws SAXException{
StringBuffer sBuffer=new StringBuffer("");
        public void attributeDecl(String eleName, String attrName, String attrType,
(继承并实现接口DeclHander可以先解析其关联DTD
public class c5_2 extends DefaultHandler implements DeclHandler {)
String attrModel, String attrDefault) throws SAXException { ///声明
public void elementDecl(String eleName, String eleModel) throws SAXException {
public void internalEntityDecl(String entityName, String entityValue)
throws SAXException {


4.各节点获取名称
元素 qName
属性 attributes.getQName(i) attribtues.getValue(i)


5.输出方法
public void characters(char[] ch,int start,int length)throws SAXException{
StringBuffer sBuffer=new StringBuffer("");
sBuffer.append(ch,start,length);
System.out.println("元素内容为:"+sBuffer.toString());

}


****************************************JDOM解析器****************************************
1.创建解析器和文档
解析已在文档:C6_1.parseXml(new File("src/c6-1.xml"));
生成:
SAXBuilder saxBuilder=new SAXBuilder();
Document doc=saxBuilder.build(xmlFile);


2.获得节点
Element root=doc.getRootElement();//根元素
List<Element> childList=root.getChildren();//获得孩子列表
Element element=childList.get(i);//孩子列表中获得某个元素


3.获得名字、值
root.getName()
element.getName()
attr.getName()
attr.getValue()
attr.getAttributeType()


4.创建节点
Element root=new Element("学生名册");//创建元素,文本节点也是这样
Document doc=new Document(root);//设为根节点
name.setText("张三");
student.addContent(name);//添加节点,也适用于根元素(根节点)
student.setAttribute("年龄","16级");//直接设置属性


5.文档生成
Format format=Format.getCompactFormat();
format.setEncoding("gb2312");
XMLOutputter xmlout=new XMLOutputter(format);
xmlout.output(doc,new FileOutputStream("src/c6-2.xml"));


****************************************DOM4j解析器****************************************
1.获得解析器
SAXReader reader=new SAXReader();


2.获得元素
Element root=doc.getRootElement();//获得根元素
List el=ele.elements();//获得子元素列表
List attList =ele.attributes();//获得元素属性列表


3.获得名字和属性等
ele.getName()
attr.getName()
attr.getValue()
ele("content").getText();//获取文本


if(!element.isTextOnly()){


4.创建节点
Element root=DocumentHelper.createElement("学生名册");
Document document=DocumentHelper.createDocument(root);//以该根元素建立文档
root.addAttribute("学校","XX大学");//添加属性
Element stuElement=root.addElement("学生");//添加元素
stuElement.addAttribute("年级", "16级").addAttribute("学号","16098765");
birthElement.setText("2018-08-08");//添加文本


5.文档生成
XMLWriter xmlWriter=new XMLWriter();
xmlWriter.write(document);
OutputFormat format=new OutputFormat(" ",true);
XMLWriter xmlWriter2=new XMLWriter(new FileOutputStream(new File("src/student2_dom4j.xml")),format);
xmlWriter2.write(document);


6.访问者模式
(Visitor里只实现visit(Element node)、 visit(Attribute node)和visit(ProcessingInstruction node)3个方法,这意味着该Vistor只处理XML文档里的元素,属性和处理指令。)
class YeekuVistor extends VisitorSupport
实现    public void visit(Element node) {     
public void visit(Attribute node)
public void visit(ProcessingInstruction node)
//使用访问者模式来访问XML文档
doc.accept(new YeekuVistor());




原创粉丝点击