XML名称空间的解析

1.SAX解析名称空间:继承DefaultHandler,复写startPrefixMapping()和endPrefixMapping()两个方法解析名称空间。
代码如下:
`

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;


public class SAXNSPrinter extends DefaultHandler
{
    @Override
    public void startPrefixMapping(String prefix, String uri)
            throws SAXException
    {
        System.out.println("----------------Namespace scope behin--------------");
        System.out.println("Namespace prefix : "+prefix + "\nNamespace uri : "+uri +"\n\n");
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attrs) throws SAXException
    {
        if(!uri.equals(""))//必须为空,与DOM不一样
        {
            System.out.println("Element name : "+qName);
            System.out.println("Local name : "+localName);
            int index = qName.indexOf(":");
            if(index > 0)//有名称空间
            {
                System.out.println("Namespace prefix : " + qName.substring(0,index));
            }
            System.out.println("Namespace uri : "+uri);
            System.out.println();
        }
        int len = attrs.getLength();
        for(int i=0;i<len;i++)
        {
            String attrUri = attrs.getURI(i);
            if(!uri.equals(""))
            {
                System.out.println("Attribute name : "+attrs.getQName(i));
                System.out.println("Local name : "+attrs.getLocalName(i));
                int index = attrs.getQName(i).indexOf(":");
                if(index > 0)//有名称空间
                {
                    System.out.println("Namespace prefix : " + attrs.getQName(i).substring(0,index));
                }
                System.out.println("Namespace uri : "+attrUri);
                System.out.println();
            }
        }
    }


    @Override
    public void endPrefixMapping(String prefix) throws SAXException
    {
        System.out.println("Namespace prefix : " + prefix);
        System.out.println("----------------Namespace scope end--------------\n");
    }


    public static void main(String[] args) throws Exception
    {
        /*
        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setNamespaceAware(true);//设置对名称空间解析的支持,必须的
        SAXParser sp = spf.newSAXParser();
        sp.parse("books.xml", new SAXNSPrinter());
        */

        XMLReader xmlReader = XMLReaderFactory.createXMLReader();
        xmlReader.setContentHandler(new SAXNSPrinter());
        xmlReader.parse(new InputSource(new FileInputStream("books.xml")));
    }

}


2、DOM解析名称空间:通过getXXX获取信息。
代码如下:

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.*;


public class DomNSPrinter
{

    //打印元素,属性的名称空间信息
    public static void printNSInfo(Node node)
    {
        short type = node.getNodeType();
        switch(type)
        {
        case Node.ELEMENT_NODE:
            if(node.getNamespaceURI() != null)
            {
                System.out.println("Element name : "+node.getNodeName());
                System.out.println("Local name : " +node.getLocalName());
                System.out.println("Namespace Prefix : "+node.getPrefix());
                System.out.println("Namespace URI : "+node.getNamespaceURI());
                System.out.println();
            }
            if(node.hasAttributes()){
                NamedNodeMap  attrs = node.getAttributes();
                int len = attrs.getLength();
                for(int i=0;i<len;i++)
                {
                    Node attr = attrs.item(i);
                    if(attr.getNamespaceURI() != null)
                        printNSInfo(attr);//递归调用

                }
            }
            Node child = node.getFirstChild();
            while(child!=null){
                printNSInfo(child);
                child = child.getNextSibling();//下一个节点
            }
            break;
        case Node.ATTRIBUTE_NODE:

            System.out.println("Atrribute name : "+node.getNodeName());
            System.out.println("Local name : " +node.getLocalName());
            System.out.println("Namespace Prefix : "+node.getPrefix());
            System.out.println("Namespace URI : "+node.getNamespaceURI());
            System.out.println();
            break;
            default :
                break;

        }
    }
    public static void main(String[] args) throws Exception
    {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);//对名称空间的解析。必须有
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(new File("books.xml"));
        printNSInfo(doc.getDocumentElement());




    }
}


3、JDOM解析名称空间:通过getAdditionalNamespaces();获取元素上附加的其他名称空间声明(本元素未使用的名称空间声明),然后通过Iterater遍历。
代码如下:

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import org.jdom2.*;
import org.jdom2.input.SAXBuilder;


public class JDOMNSPrinter
{

    public static void printNSInfo(Element elt){
        String eltNSUri = elt.getNamespaceURI();
        if(!eltNSUri.equals(""))
        {
            System.out.println("Element name : "+elt.getQualifiedName());
            System.out.println("Local name : "+elt.getName());
            System.out.println("Namespace prefix : "+elt.getNamespacePrefix());
            System.out.println("Namespace uri : "+eltNSUri);
            System.out.println();
        }
        List l = elt.getAdditionalNamespaces();
        for (Iterator iterator = l.iterator(); iterator.hasNext();)
        {
            Namespace ns = (Namespace) iterator.next();
            System.out.println("------------------Namespace declaration------------");
            System.out.println("Namespace prefix : "+ns.getPrefix());
            System.out.println("Namespace uri : "+ns.getURI());
            System.out.println();
        }
        l = elt.getAttributes();
        for (Iterator iterator = l.iterator(); iterator.hasNext();)
        {
            Attribute attr = (Attribute) iterator.next();
            String attrNSUri = attr.getNamespaceURI();
            if(!attrNSUri.equals(""))
            {
                System.out.println("Element name : "+attr.getQualifiedName());
                System.out.println("Local name : "+attr.getName());
                System.out.println("Namespace prefix : "+attr.getNamespacePrefix());
                System.out.println("Namespace uri : "+attr);
                System.out.println();
            }
        }
        l = elt.getChildren();
        for (Iterator iterator = l.iterator(); iterator.hasNext();)
        {
            Element element = (Element) iterator.next();
            printNSInfo(element);

        }
    }
    public static void main(String[] args) throws Exception
    {
        SAXBuilder saxBuilder = new SAXBuilder();
        Document doc = saxBuilder.build(new File("books.xml"));
        printNSInfo(doc.getRootElement());

    }

}


4、DOM4J解析名称空间:采用访问者VisitorSupport内部类实现解析,与JDOM类似,通过getAdditionalNamespaces();获取元素上附加的其他名称空间声明(本元素未使用的名称空间声明),然后通过Iterater遍历。
代码如下:

import java.io.File;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.VisitorSupport;
import org.dom4j.io.SAXReader;


public class DOM4jNSPrinter
{

    public static void main(String[] args) throws Exception
    {
        SAXReader saxReader = new SAXReader();
        Document doc = saxReader.read(new File("books.xml"));
        doc.accept(new VisitorPrinter());
    }

    private static class VisitorPrinter extends VisitorSupport
    {

        @Override
        public void visit(Attribute attr)
        {
            String attrNSuri = attr.getNamespaceURI();
            if(!attrNSuri.equals(""))
            {
                System.out.println("Attribute name : "+attr.getQualifiedName());
                System.out.println("Local name : "+attr.getName());
                System.out.println("Namespace prefix : "+attr.getNamespacePrefix());
                System.out.println("Namespace uri : "+attrNSuri);
                System.out.println();
            }           
        }

        @Override
        public void visit(Element elt)
        {
            String eltNSUri = elt.getNamespaceURI();
            if(!eltNSUri.equals(""))
            {
                System.out.println("Element name : "+elt.getQualifiedName());
                System.out.println("Local name : "+elt.getName());
                System.out.println("Namespace prefix : "+elt.getNamespacePrefix());
                System.out.println("Namespace uri : "+eltNSUri);
                System.out.println();
            }
            List l = elt.additionalNamespaces();//与JDOM类似
            for (Iterator iterator = l.iterator(); iterator.hasNext();)
            {
                Namespace ns = (Namespace) iterator.next();
                System.out.println("------------------Namespace declaration------------");
                System.out.println("Namespace prefix : "+ns.getPrefix());
                System.out.println("Namespace uri : "+ns.getURI());
                System.out.println();
            }



        }

    }
}


5、books.xml代码如下:

<?xml version ="1.0" encoding = "gb2312"?>

<bks:books xmlns:bks="http://www.qinyi/books"
           xmlns:text="http://www.qinyi/text">
    <bks:book bks:bookID = "book001">
        <bks:title>JAVA web开发详解</bks:title>
        <bks:author xmlns="http://www.qinyi/people">
            <name>丽丽</name>
            <title>教师</title>
        </bks:author>
    </bks:book>
</bks:books>

`

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值