从XML文件中获取模式位置(noNamespaceSchemaLocation)

时间:2012-02-28 13:45:13

标签: java sax

我们正在使用SAX解析器解析XML文件。是否可以从XML获取架构位置?

<view id="..." title="..."
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="{schema}">

我想从XML中检索{schema}值。这可能吗?以及如何访问noNamespaceSchemaLocation的此值?我正在使用默认的SAX Parser。

@Override
public void startElement(String uri, String localName, 
                         String name, Attributes attributes)
{ .... }

谢谢。

2 个答案:

答案 0 :(得分:1)

这完全取决于你正在使用什么样的工具/库(一个基本的SAXParser?Xerces?JDom?...)但你想要的是URI定义的namspace中属性“noNamespaceSchemaLocation”的值“ http://www.w3.org/2001/XMLSchema-instance“

在JDom中,它会是这样的:

Element view = ...; // get the view element
String value = view.getAttributeValue("noNamespaceSchemaLocation", Namespace.getNamespace("http://www.w3.org/2001/XMLSchema-instance"));

答案 1 :(得分:0)

这是我使用XMLStreamReader获得XSD名称的方法:

public static String extractXsdValueOrNull(@NonNull final InputStream xmlInput)
{
    final XMLInputFactory f = XMLInputFactory.newInstance();
    try
    {
        final XMLStreamReader r = f.createXMLStreamReader(xmlInput);
        while (r.hasNext())
        {
            final int eventType = r.next();
            if (XMLStreamReader.START_ELEMENT == eventType)
            {
                for (int i = 0; i <= r.getAttributeCount(); i++)
                {
                    final boolean foundSchemaNameSpace = XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI.equals(r.getAttributeNamespace(i));
                    final boolean foundLocationAttributeName = SCHEMA_LOCATION.equals(r.getAttributeLocalName(i));

                    if (foundSchemaNameSpace && foundLocationAttributeName)
                    {
                        return r.getAttributeValue(i);
                    }
                }
                return null; // only checked the first element
            }
        }
        return null;
    }
    catch (final XMLStreamException e)
    {
        throw new RuntimeException(e);
    }
}

实际上,XMLStreamReader发挥了所有作用,即:

  • 仅解析XML的开头(而不是整个XML)
  • 不采用特定的名称空间别名(即xsi