XML является для хранения структурированных данных. Ниже приведен пример Данные представлены в файле XML.

Каждый документ XML хорошо сформированной должен содержать версию стандарта XML используется и одного элемента документа. Элементом документа является корнем пункта. Все данные должны быть места под элементом документа.

XML замечания должны быть помещены в комментарии блоки следующим образом:

<!-- file: sample.xml -->
<?xml version="1.0"?>
<!-- our XML-document describes a purchase order -->
<purchase-order>
<date>2005-10-31</date>
<number>12345</number>
<purchased-by>
<name>My name</name>
<address>My address</address>
</purchased-by>
<!-- a collection element, contains a set of items -->
<order-items>
<item>
<code>687</code>
<type>CD</type>
<label>Some music</label>
</item>
<item>
<code>129851</code>
<type>DVD</type>
<label>Some video</label>
</item>
</order-items>
</purchase-order>

SAX является интерфейсом спецификацией W3C. Так, оно может иметь различные реализации, она определяет специфические черты и свойства.

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


import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXNotRecognizedException;



/**

 * This sample shows how to request the features

 * current SAX-parser implementation supports.

 */



public class RequestFeaturesSample {



   /**

    * Application entry point

    @param args command-line arguments

    */

   public static void main(String[] args) {



      try {



  // creates and returns new instance of SAX-implementation:

  SAXParserFactory factory = SAXParserFactory.newInstance();



  // all the features are represented by boolean values,

  // indicating is each feature set (supported) or not:

  String features[] {

        "http://xml.org/sax/features/namespaces",

     "http://xml.org/sax/features/namespace-prefixes",

     "http://xml.org/sax/features/string-interning",

     "http://xml.org/sax/features/validation",

     "http://xml.org/sax/features/external-general-entities",

     "http://xml.org/sax/features/external-parameter-entities",

     "http://xml.org/sax/features/lexical-handler/parameter-entities",

  };



  // request the values of all the features:

  System.out.println("SAX features:");

  

  for (int i = 0; i < features.length; i++) {

    System.out.print("\t- '" + features[i"' is ");

    try {

    

         System.out.println("'" 

            factory.getFeature(features[i]) "'");

            

    catch (SAXNotRecognizedException ex) {

       System.out.println("not supported");

    }

  }



      catch (Exception ex) {

    ex.printStackTrace();

      }

   }

}

Часто, когда SAX-парсер встречает плохо символом в исходном XML-документ, он доклады об этой ошибке. Для потребителя это будет больше знать строки и столбцов, где произошла ошибка. SAX композиций текущую позицию чтения в исходном XML с помощью локатора. SAX-обработчик может спасти локатора для следующих подробный вывод ошибок.

Приведенный ниже код показывает, как обращаться с локатором:


import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;



import org.xml.sax.Attributes;

import org.xml.sax.Locator;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;



/**

 * This example demonstrates how to indicate current position

 * in the source XML-document.

 */



public class SampleOfXmlLocator extends DefaultHandler {

    private Locator locator;

    

    // this will be called when XML-parser starts reading

    // XML-data; here we save reference to current position in XML:

    public void setDocumentLocator(Locator locator) {

        this.locator = locator;

    }

    

    // here we accept only 'purchase-order';

    // in all the rest cases we will raise

    // an exception with detailed message:

    public void startElement(String uri, String localName,

            String qName, Attributes attrsthrows SAXException {

        

        if (qName.equals("purchase-order")) {

            // ... here process element start:

        else {

            

            // compose a text with location of error-case:

            String location = "";

            if (locator != null) {

                location = locator.getSystemId()// XML-document name;

                location += " line " + locator.getLineNumber();

                location += ", column " + locator.getColumnNumber();

                location += ": ";

            }

            

            throw new SAXException(location + "Illegal element");

        }

    }

    

    /**

     * Application entry point

     @param args command-line arguments

     */

    public static void main(String[] args) {

        try {

            // creates and returns new instance of SAX-implementation:

            SAXParserFactory factory = SAXParserFactory.newInstance();

            factory.setValidating(true);

            

            // create SAX-parser...

            SAXParser parser = factory.newSAXParser();

            // and parse:

            parser.parse("sample.xml"new SampleOfXmlLocator());

            

        catch (Exception ex) {

            ex.printStackTrace(System.out);

        }

    }

}

Проверка представляет собой процесс проверки исходного XML документа, чтобы соответствовать его DOCTYPE referes. Если документ соответствует его Doc-типа, то Calles действительными, в противном случае документ является недействительным. Для того, чтобы рассказать SAX, чтобы проверить документ на действия correspodning собственности SAX-парсер заводе должно быть установлено так, как следующим образом:


  // create new factory is ordinary way:

  SAXParserFactory factory = SAXParserFactory.newInstance();



  // specifies that the parser produced by this factory will

  // validate documents as they are parsed.

  factory.setValidating(true);

  

  // this parser will validate XML-input:

  SAXParser parser = factory.newSAXParser();

Кроме коллекции каждого ребенка элементами XML-элемент может содержать любой набор атрибутов. Каждый атрибут пары имя-значение. XML атрибуты должны быть расположены внутри Открытие наценкой элемента, между элементами название и символ '>'. Использование атрибутов может привести к элементу быть пустыми, например, не имеет дети. XML-документ ниже использованием атрибутов.

<!-- file: sample.xml -->
<?xml version="1.0"?>

Атрибута удобно, когда необходимо установить некоторые примитивные (не-сложной) значения.

<purchase-order date="2005-10-31" number="12345">
<purchased-by name="My name">
<!--
since address may be too complex for attribute
value, we place it to a dedicated element
-->
<address>My address</address>
</purchased-by>
<order-items>
<!--
here is an example of empty element
i.e. containing no nested elements
-->
<item code="687" type="CD" label="Some music" />
<item code="129851" type="DVD" label="Some video"/>
</order-items>
</purchase-order>

Поскольку SAX только интерфейс, с тем чтобы использовать это приложение должно определить ее осуществления. SAX парсер реализации в Java может быть установлена через систему собственности javax.xml.parsers.SAXParserFactory. Xerces Так как пакет был интегрирован с Java Runtime Envorinment, эта реализация используется по умолчанию. По этой причине, в общем случае нет необходимости указывать альтернативный парсера:


  // creating built-in (default) implementation of SAX:

  SAXParserFactory factory = SAXParserFactory.newInstance();



  // create SAX-parser...

  SAXParser parser = factory.newSAXParser();



  // now we are ready to parse XML data...

Есть два критерия для XML-документа: хорошо форму и силу. Хотя хорошо форму критериев отражает правильный синтаксис XML-только действия проверяет данные, описанные в XML.

Для того, чтобы проверить, где документ является действительным или нет он должен быть связан с Определение типа документа (DTD) или XML Schema.

Пример ниже показывает DTD для нашей выборки XML:

<!-- file: sample.xml -->
<?xml version="1.0"?>
<!DOCTYPE purchase-order [
<!-- declaration of the root element and its attributes -->
<!ELEMENT purchase-order (purchased-by, order-items)>
<!ATTLIST purchase-order
date   CDATA #REQUIRED
number CDATA #REQUIRED
>
<!ELEMENT purchased-by (address)>
<!ATTLIST purchased-by
name CDATA #REQUIRED
>
<!ELEMENT address (#PCDATA)>
<!-- order-items can contains at least on item -->
<!ELEMENT order-items (item+)>
<!ELEMENT item EMPTY>
<!ATTLIST item
code  CDATA #REQUIRED
type  CDATA #REQUIRED
label CDATA #REQUIRED
>
]>
<!--
In order to constrain the contents of XML-document
a DTD-definition may be used.
The DTD-definition can be inserted immediately into
the caption of target XML-file.
-->
<purchase-order date="2005-10-31" number="12345">
<purchased-by name="My name">
<address>My address</address>
</purchased-by>
<order-items>
<!--
here is an example of empty element
i.e. containing no nested elements
-->
<item code="687" type="CD" label="Some music" />
<item code="129851" type="DVD" label="Some video"/>
</order-items>
</purchase-order>

Поскольку SAX является простым API для XML обеспечивает низкого уровня и высокой производительности интерфейс для обработки входящих XML-данных. SAX основан на XML-элемента модели обработчика. Загрузки программы XML должен определить свой собственный документ-обработчика и передать свой экземпляр парсера SAX.

Умолчанию обработчик имеет по крайней мере обратного вызова метода обработки запуска и остановки наценки в XML-элементов:

<!-- file: sample.xml -->
<?xml version="1.0"?>
<!--
XML files are used to store data as a tree of elements.
Each XML-document can have only single root element.
It wraps all the data.
-->
<purchase-order>
<date>2005-10-31</date>
<number>12345</number>
<purchased-by>
<name>My name</name>
<address>My address</address>
</purchased-by>
<order-items>
<item>
<code>687</code>
<type>CD</type>
<label>Some music</label>
</item>
<item>
<code>129851</code>
<type>DVD</type>
<label>Some video</label>
</item>
</order-items>
</purchase-order>



import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;



import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;



/**

 * Here is an example of parsing of XML data

 * with help of document-handler.

 */



public class SimpleSaxHandler {

    /**

     * Application entry point

     @param args command-line arguments

     */

    public static void main(String[] args) {

        try {

            // creates and returns new instance of SAX-implementation:

            SAXParserFactory factory = SAXParserFactory.newInstance();

            

            // create SAX-parser...

            SAXParser parser = factory.newSAXParser();

            // .. define our handler:

            SaxHandler handler = new SaxHandler();

            

            // and parse:

            parser.parse("sample.xml", handler);

            

        catch (Exception ex) {

            ex.printStackTrace(System.out);

        }

    }

    

    /**

     * Our own implementation of SAX handler reading

     * a purchase-order data.

     */

    private static final class SaxHandler extends DefaultHandler {

        // invoked when document-parsing is started:

        public void startDocument() throws SAXException {

            System.out.println("Document processing started");

        }

        

        // notifies about finish of parsing:

        public void endDocument() throws SAXException {

            System.out.println("Document processing finished");

        }

        

        // we enter to element 'qName':

        public void startElement(String uri, String localName, 

                String qName, Attributes attrsthrows SAXException {

            

            if (qName.equals("purchase-order")) {

            else if (qName.equals("date")) {

            /* if (...)

                        } */ else {

                throw new IllegalArgumentException("Element '" 

                        qName + "' is not allowed here");

                        }

        }

        

        // we leave element 'qName' without any actions:

        public void endElement(String uri, String localName, String qName)

        throws SAXException {

            // do nothing;

        }

    }

}

В большинстве случаев DTD определения распределяется между многочисленными XML-документы, которые он описывает. В такой ситуации это будет более удобно разместить такое DTD в посвящает документ доступен на данный URL (Calles Система-ID) или название (государственно-ID). Таким образом, все документы XML при помощи типов, определенных в этом DTD-файл будет просто сослаться его, как это показано в образце ниже:

<!-- file: purchase-order.dtd -->
<!-- declaration of the root element and its attributes -->
<!ELEMENT purchase-order (purchased-by, order-items)>
<!ATTLIST purchase-order
date   CDATA #REQUIRED
number CDATA #REQUIRED
>
<!ELEMENT purchased-by (address)>
<!ATTLIST purchased-by
name CDATA #REQUIRED
>
<!ELEMENT address (#PCDATA)>
<!-- order-items can contains at least on item -->
<!ELEMENT order-items (item+)>
<!ELEMENT item EMPTY>
<!ATTLIST item
code  CDATA #REQUIRED
type  CDATA #REQUIRED
label CDATA #REQUIRED
>
<!-- file: sample.xml -->
<?xml version="1.0"?>
<!-- Sample of linked DTD definition -->
<!DOCTYPE purchase-order SYSTEM "purchase-order.dtd">
<!--
In order to constrain the contents of XML-document
a DTD-definition may be refered in DOCTYPE instruction.
-->
<purchase-order date="2005-10-31" number="12345">
<purchased-by name="My name">
<address>My address</address>
</purchased-by>
<order-items>
<!--
here is an example of empty element
i.e. containing no nested elements
-->
<item code="687" type="CD" label="Some music" />
<item code="129851" type="DVD" label="Some video"/>
</order-items>
</purchase-order>

Если JRE внедрения используется для запуска приложения вы не содержит встроенный анализатор реализация SAX (или не нравится), вы можете настроить его с помощью системных свойств.

Когда SAXParserFactory предлагается создание новых экземпляров, он ищет системные свойства для вступления с именем javax.xml.parsers.SAXParserFactory. Это свойство должно содержать имя класса implemeneting SAX интерфейс.

Приведенный ниже пример показывает, как заставить Apache реализации SAX:


import java.io.*;

import org.w3c.dom.*;



public class Test {

    public static void main(String[] argsthrows Exception {

        

        // Sets the sax parser property to use the xerces parser;

        // Here any other SAX-implementation may be refered:

        System.setProperty("avax.xml.parsers.SAXParserFactory",

                "org.apache.xerces.parsers.SAXParser");

        

        // creating built-in (default) implementation of SAX:

        SAXParserFactory factory = SAXParserFactory.newInstance();

        

        // create SAX-parser...

        SAXParser parser = factory.newSAXParser();

        

        // now we are ready to parse XML data...

    }

}