Java SAXParser: различается между `localName` и` qName`

В Java класс Handler содержит метод, имя которого startElement. Этот метод имеет прототип:

public void startElement(String uri, String localName, String qName, Attributes attributes)

Я читал на веб-сайте Oracle Java, но я до сих пор не понимаю, что отличается от параметра localName и qName. Они объясняют:

localName - локальное имя (без префикса) или пустая строка if Обработка пространства имен не выполняется.     qName - квалифицированное имя XML 1.0 (с префиксом) или пустая строка, если нет доступных имен.

В приведенном выше определении я не знаю некоторых понятий: prefix (префикс чего?) Namespace

Кто может объяснить мне (как можно проще) об этих параметрах, пожалуйста.

спасибо:)

Ответ 1

В качестве примера я расскажу о следующем примере XML:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="note">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="to" type="xs:string"/>
        <xs:element name="from" type="xs:string"/>
        <xs:element name="heading" type="xs:string"/>
        <xs:element name="body" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Пространство имен

Пространство имен - это логический контейнер, в котором определен элемент. Пространство имен XML Schema (с uri: http://www.w3.org/2001/XMLSchema). В вышеприведенном документе ссылка на него указана в строке 2. Обработка XML-документа может возникать с использованием синтаксического анализатора XML, который либо известен как имя, либо нет, но документы, использующие пространства имен, как правило, должны анализироваться с помощью парсеров, ориентированных на пространство имен.

Пространства имен определены так, что a) они могут быть каталогизированы синтаксическим анализатором и b), так что элементы с тем же именем в разных пространствах имен могут существовать в одном документе без двумерного определения.

Префикс

Префикс - это короткий ключ, используемый для обращения к пространству имен. В приведенном выше примере xs используется для обозначения пространства имен XML Schema.

Локальное имя (часть)

Элемент документа имеет имя, определенное в пространстве имен. В приведенном выше примере вы можете найти schema, element, complexType, sequence и element как локальные имена. Локальные имена могут быть неоднозначными, если в вашем документе указано несколько пространств имен, и одно или несколько из этих пространств имен определяют элементы с тем же именем.

Квалифицированное имя (qName)

Ключевое имя состоит из префикса для пространства имен (необязательно, некоторые реализации могут использовать пространство имен uri), за которым следует :, а затем локальное имя элемента. В приведенном выше примере вы можете найти xs:schema, xs:element, xs:complexType, xs:sequence и xs:element в качестве квалифицированных имен. Эти имена недвусмысленны и могут обрабатываться парсером и проверяться.

Ответ 2

Райан отвечает отлично. Единственная другая информация, которая вам нужна, состоит в том, что точные сведения о том, что сообщается в событии startElement в SAX, зависят от различных параметров конфигурации анализатора SAX. К сожалению, у меня нет времени подробно рассказать о том, что сделал Райан.

Ответ 3

В саксовом парсере есть локальное имя, qname и пространство имен

qname - это имя тега вместе с пространством имен, а локальное имя - только имя тега. локальное имя может быть неоднозначным, но qname никогда.

Ответ 4

QNames (Q ualified Имя) были введены пространствами имен XML, чтобы использоваться в качестве ссылок URI. QName определяет действительный идентификатор для элементов и атрибутов. QNames обычно используются для ссылки на конкретные элементы или атрибуты в документах XML и обеспечивают механизм для краткой идентификации пары {URI, local-name}. Пространства имен также могут быть объявлены в корневом элементе XML

Пример:

<?xml version='1.0'?>
  <doc xmlns:x="http://example.com/ns/foo">
    <x:p/>
  </doc>  

QName x:p - краткое, однозначное имя для пары {URI, local-name} {"http://example.com/ns/foo", "p"}. Где doc - локальное имя.

Java Analogy:

com.prem.java.Employee employee; //creating object using fully qualified name i.e. QName
Student student; //create an object using local name