【问题标题】:Nesting XML namespaces with a default使用默认值嵌套 XML 命名空间
【发布时间】:2015-08-05 20:50:24
【问题描述】:

嵌套 XML 名称空间的正确方法是什么?

我必须这样做:

<?xml version="1.0"?>
<top xmlns="http://url1" xmlns:b="http://url2">
    <b:second>
    </b:second>
</top>

或者是下面的ok

<?xml version="1.0"?>
<top xmlns="http://url1">
    <b:second xmlns:b="http://url2">
    </b:second>
</top>

另外,是否可以将第二级设置为默认值?例如:

<?xml version="1.0"?>
<a:top xmlns:a="http://url1">
    <second xmlns="http://url2">
    </second>
</a:top>

是否应该将第二层声明为在第一层命名空间中?

<?xml version="1.0"?>
<a:top xmlns:a="http://url1">
    <a:second xmlns="http://url2">
        <third>text</third>
    </a:second>
</a:top>

【问题讨论】:

  • 所有这些形式都可以,因为它们都符合格式良好的 XML。选择哪一个似乎是主观的,就像是在样本中将最外层元素命名为 top 还是 root 的问题......

标签: xml namespaces xml-namespaces


【解决方案1】:

只要命名空间继承规则给你想要的结果,所有这些都是“OK”的。

检查的一个好方法是将它传递给一个解析器,该解析器告诉你每个元素所在的命名空间。有很多方法可以给这只猫换皮。这是一个简单的java程序:

import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class Parse
{
    public static void main(String[] args)
    {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            factory.setNamespaceAware(true);
            SAXParser parser = factory.newSAXParser();
            parser.parse(new File(args[0]), new Handler());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    static class Handler extends DefaultHandler
    {
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            System.out.println("qName="+qName+" uri="+uri);
        }
    }
}

如果您使用的是 linux,以下是稍微冗长的等价物:

xmllint --sax file.xml

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多