Как игнорировать похожий тег в XML SAX PARSING - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть XML как этот

<OuterTag>
       <Name>JAVA
      </Name>
<InnerTag>
     <Name> PHP
    </Name>
</InnerTag>

</OuterTag>

Я просто хочу, чтобы это значение содержало "Java".Но когда я анализирую, это также приносит "PHP", потому что локальные имена совпадают.Можно ли отфильтровать несколько локальных имен и выбрать желаемое?Как я могу это сделать?

Ответы [ 3 ]

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

Идея состоит в том, чтобы сохранить состояние, в котором вы находитесь, просто используйте логическое значение и установите для него значение true, если вы найдете открытый тег для 'OuterTag', и установите его в значение false, когда вы найдете открытый тег для 'InnerTag'..

Таким образом, когда вы находите тег «name», вы находитесь там, где находитесь.

Еще один более гибкий способ - нажимать / извлекать имена тегов, когда вы их находите.Таким образом, вы можете проверить, кто является вашим родительским тегом, когда найдете тег name, а затем получите правильное значение.

0 голосов
/ 24 февраля 2012

В синтаксических анализаторах Sax обычно есть хуки, где вы можете написать код, в частности StartElement, EndElement и characters.

Мосс имеет правильный ответ -

StartElement : поместите имя элемента в стек.

символов : если имя элемента равно «name», а в стеке имеется элемент «OuterTag», тогда вы нашли свою ценность. В противном случае игнорируйте это.

EndElement Удаление элемента из стека.


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

Я бы осторожно предложил «рассмотреть» решение XPath, которое выполняет анализ для вас, позволяя вам легко ссылаться на любой элемент. Создайте объект Xpath и запросите его с помощью чего-то вроде '/OuterTag/Name[1]' Если вы уже использовали jQuery, вы будете чувствовать себя как дома.

Однако, если ваш XML искажен или действительно большой и сложный, это может быть очень медленно. Вы были предупреждены.

Просто знайте, что XPath доступен как возможное решение. http://www.javabeat.net/tips/182-how-to-query-xml-using-xpath.html

0 голосов
/ 24 февраля 2012

Если я понимаю, что вы хотите использовать тег Name в OuterTag, а не в InnerTag.Так вот, как бы я это сделал с dom4j :

    SAXReader saxReader = new SAXReader();
    saxReader.addHandler("OuterTag/Name", new ElementHandler() {

        @Override
        public void onStart(ElementPath arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onEnd(ElementPath arg0) {
            // TODO Auto-generated method stub

        }
    });

    File inputFile = new File(filename);
    saxReader.read(inputFile);

Надеюсь, это поможет.

...