Получить расположение схемы из файла XML (noNamespaceSchemaLocation) - PullRequest
1 голос
/ 28 февраля 2012

Мы анализируем файл XML с помощью синтаксического анализатора SAX.Можно ли получить расположение схемы из XML?

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

Я хочу получить значение {schema} из XML.Это возможно?И как мне получить доступ к этому значению noNamespaceSchemaLocation?Я использую SAX Parser по умолчанию.

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Все зависит от того, с каким инструментом / библиотекой вы работаете (базовый SAXParser? Xerces? JDom? ...). Но что вам нужно, это значение атрибута "noNamespaceSchemaLocation" в пространстве имен, определяемом URI " 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"));
0 голосов
/ 17 октября 2018

Вот как я получаю имя XSD, используя XMLStreamReader:

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)
...