Извлечение текстовых узлов из XML-файла с использованием SAX Parser в JAVA

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

Например, в данном XML-документе:

<w:rStyle w:val="Highlight" /> 
  </w:rPr>
  </w:pPr>
- <w:r>
  <w:t>Text to Extract</w:t> 
  </w:r>
  </w:p>
- <w:p w:rsidR="00B41602" w:rsidRDefault="00B41602" w:rsidP="007C3A42">
- <w:pPr>
  <w:pStyle w:val="Copy" /> 

Я могу без проблем извлечь «Highlight», получив значение из val. Но я понятия не имею, как попасть в этот текстовый узел и выбрать «Текст для извлечения».

Вот мой Java-код для извлечения значений атрибутов...

private static final class SaxHandler extends DefaultHandler 
    {
        // invoked when document-parsing is started:
        public void startDocument() throws SAXException 
        {
            System.out.println("Document processing starting:");
        }

        // notifies about finish of parsing:
        public void endDocument() throws SAXException 
        {
            System.out.println("Document processing finished. \n");
        }

        // we enter to element 'qName':
        public void startElement(String uri, String localName, 
                String qName, Attributes attrs) throws SAXException 
        {
            if(qName.equalsIgnoreCase("Relationships"))
            {
                // do nothing
            }
            else if(qName.equalsIgnoreCase("Relationship"))
            {
                // goes into the element and if the attribute is equal to "Target"...
                String val = attrs.getValue("Target");
                // ...and the value is not null
                if(val != null)
                {
                    // ...and if the value contains "image" in it...
                    if (val.contains("image"))
                    {
                        // ...then get the id value
                        String id = attrs.getValue("Id");
                        // ...and use the substring method to isolate and print out only the image & number
                        int begIndex = val.lastIndexOf("/");
                        int endIndex = val.lastIndexOf(".");
                        System.out.println("Id: " + id + " & Target: " + val.substring(begIndex+1, endIndex));
                    }
                }
            }
            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;
        }
     }

Но я понятия не имею, с чего начать, чтобы попасть в этот текстовый узел и вытащить значения внутри. У кого-нибудь есть идеи?


person This 0ne Pr0grammer    schedule 29.06.2011    source источник
comment
Рассматривали ли вы использование XPath, это намного проще...   -  person vtd-xml-author    schedule 24.05.2016


Ответы (1)


Вот некоторый псевдокод:

private boolean insideElementContainingTextNode;
private StringBuilder textBuilder;

public void startElement(String uri, String localName, String qName, Attributes attrs) {
    if ("w:t".equals(qName)) { // or is it localName?
        insideElementContainingTextNode = true;
        textBuilder = new StringBuilder();
    }
}

public void characters(char[] ch, int start, int length) {
    if (insideElementContainingTextNode) {
        textBuilder.append(ch, start, length);
    }
}

public void endElement(String uri, String localName, String qName) {
    if ("w:t".equals(qName)) { // or is it localName?
        insideElementContainingTextNode = false;
        String theCompleteText = this.textBuilder.toString();
        this.textBuilder = null;
    }
}
person JB Nizet    schedule 29.06.2011
comment
Хм, я пробовал это, но он не извлекал никакого текста. Можете ли вы объяснить, что этот код должен делать? - person This 0ne Pr0grammer; 30.06.2011
comment
В startElement вы проверяете, начинает ли синтаксический анализатор читать элемент, содержащий текстовый узел, который вы хотите извлечь. Если да, вы устанавливаете логическую переменную в true. Таким образом, метод символов знает, что он находится внутри соответствующего элемента, и сохраняет прочитанный текст внутри StringBuilder. Метод endElement вызывается при достижении конца элемента. Таким образом, вы можете получить содержимое StringBuilder и сохранить его в любом месте. Я сохранил его только в локальной переменной (theCompleteText), но вы можете сохранить его в переменной экземпляра, если вам нужно. - person JB Nizet; 30.06.2011
comment
Вы можете избавиться от этого логического значения и вместо этого протестировать if (textBuilder != null) в методе символов. - person daiscog; 13.11.2014