How to handle namespaces using SAX Parser?

I'm trying to learn how to parse XML documents, I have an XML document that uses namespaces, so I'm sure I need to do something for the right analysis.

This is what I have:

DefaultHandler handler = new DefaultHandler() {

                boolean bfname = false;
                boolean blname = false;
                boolean bnname = false;
                boolean bsalary = false;

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

                    System.out.println("Start Element :" + qName);

                    if (qName.equalsIgnoreCase("FIRSTNAME")) {
                        bfname = true;
                    }

                    if (qName.equalsIgnoreCase("LASTNAME")) {
                        blname = true;
                    }

                    if (qName.equalsIgnoreCase("NICKNAME")) {
                        bnname = true;
                    }

                    if (qName.equalsIgnoreCase("SALARY")) {
                        bsalary = true;
                    }

                }

                public void endElement(String uri, String localName,
                        String qName) throws SAXException {

                    System.out.println("End Element :" + qName);

                }

                public void characters(char ch[], int start, int length) throws SAXException {

                    if (bfname) {
                        System.out.println("First Name : " + new String(ch, start, length));
                        bfname = false;
                    }

                    if (blname) {
                        System.out.println("Last Name : " + new String(ch, start, length));
                        blname = false;
                    }

                    if (bnname) {
                        System.out.println("Nick Name : " + new String(ch, start, length));
                        bnname = false;
                    }

                    if (bsalary) {
                        System.out.println("Salary : " + new String(ch, start, length));
                        bsalary = false;
                    }

                }

            };

            saxParser.parse(file, handler);

My question is: how can I handle the name table in this example?

+4
source share
2 answers

XML- : URI ( startElement endElement). , . , , -.

<foo xmlns="FOO">
    <bar>Hello World</bar>
</foo>

<foo xmlns="BAR">
    <bar>Hello World</bar>
</foo>

( ) qName. , , , qName , . . , QNames .

<foo xmlns="FOO">
    <bar>Hello World</bar>
</foo>

<ns:foo xmlns:ns="FOO">
    <ns:bar>Hello World</ns:bar>
<ns:foo>
+4

, , :

<?xml version="1.0" encoding="UTF-8"?>
<!-- ns.xml -->
<root xmlns:foo="http://data" xmlns="http://data">
  <foo:record>ONE</foo:record>
  <bar:record xmlns:bar="http://data">TWO</bar:record>
  <record>THREE</record>
  <record xmlns="http://metadata">meta 1</record>
  <foo:record xmlns:foo="http://metadata">meta 2</foo:record>
</root>

. http://data; http://metadata. .

:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:root xmlns:ns0="http://data" xmlns:ns1="http://metadata">
  <ns0:record>ONE</ns0:record>
  <ns0:record>TWO</ns0:record>
  <ns0:record>THREE</ns0:record>
  <ns1:record>meta 1</ns1:record>
  <ns1:record>meta 2</ns1:record>
</ns0:root>

.

:

class MetadataPrinter extends DefaultHandler {
  private boolean isMeta = false;

  @Override
  public void startElement(String uri, String localName, String qName,
      Attributes attributes) throws SAXException {
    isMeta = "http://metadata".equals(uri) && "record".equals(localName);
  }

  @Override
  public void endElement(String uri, String localName, String qName)
      throws SAXException {
    if (isMeta) {
      System.out.println();
      isMeta = false;
    }
  }

  @Override
  public void characters(char[] ch, int start, int length)
      throws SAXException {
    if (isMeta) {
      System.out.print(new String(ch, start, length));
    }
  }
}

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser parser = factory.newSAXParser();
parser.parse(new File("ns.xml"), new MetadataPrinter());

. Java-API Java (SAX DOM .)

+4

Source: https://habr.com/ru/post/1527155/


All Articles