Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> парсинг XML с помощm. XPath, namespace 
:(
    Опции темы
sith
Дата 5.12.2007, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: нет
Всего: 1



есть такой вот xml файл 

Код

<?xml version=“1.0″ encoding=“utf-8″ ?>
  <D:propertyupdate xmlns:D=“DAV:”
                 xmlns:Z=“http://www.w3.com/standards/z39.50/”>
    <D:set>
      <D:prop>
        <Z:authors>
          <Z:Author>Jim Whitehead</Z:Author>
          <Z:Author>Roy Fielding</Z:Author>
        </Z:authors>
      </D:prop>
    </D:set>
   </D:propertyupdate>



как с помощью XPath получить значение Jim Whitehead, и как определить что в теге <Z:authors> два тега а не один...
 smile 






--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
alexadr
Дата 5.12.2007, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.9.2006

Репутация: 4
Всего: 4



Код

import org.w3c.dom.Document;
import org.apache.xpath.XPathAPI;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import java.io.ByteArrayInputStream;

public class TestXPath {

    private static final String XML = "<?xml version=\"1.0\"?>\n" +
            "  <D:propertyupdate xmlns:D=\"DAV:\"\n" +
            "                 xmlns:Z=\"http://www.w3.com/standards/z39.50/\">\n" +
            "    <D:set>\n" +
            "      <D:prop>\n" +
            "        <Z:authors>\n" +
            "          <Z:Author>Jim Whitehead</Z:Author>\n" +
            "          <Z:Author>Roy Fielding</Z:Author>\n" +
            "        </Z:authors>\n" +
            "      </D:prop>\n" +
            "    </D:set>\n" +
            "   </D:propertyupdate>";

    public static void main(String [] args) throws Exception {
        DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = df.newDocumentBuilder();
        ByteArrayInputStream bin = new ByteArrayInputStream(XML.getBytes());
        Document doc = builder.parse(bin);
        String node1 = XPathAPI.selectSingleNode(doc, "/propertyupdate/set/prop/authors/Author[1]/text()").getNodeValue();
        String node2 = XPathAPI.selectSingleNode(doc, "/propertyupdate/set/prop/authors/Author[2]/text()").getNodeValue();

        System.out.println("first  name: " + node1);
        System.out.println("second name: " + node2);
    }
}

PM MAIL   Вверх
sith
Дата 5.12.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 11.2.2007

Репутация: нет
Всего: 1



... то есть делаешь это без исопльзования namespace_ов...
... в это статье http://www.ibm.com/developerworks/xml/libr...vaxpathapi.html  ... есть пример кода  для работы с неймспейсами... но у меня он не работает


Код

 XPathFactory factory = XPathFactory.newInstance();
  XPath xpath = factory.newXPath();
  xpath.setNamespaceContext(new PersonalNamespaceContext());
  XPathExpression expr 
    = xpath.compile("//pre:book[pre:author='Neal Stephenson']/pre:title/text()");

  Object result = expr.evaluate(doc, XPathConstants.NODESET);
  NodeList nodes = (NodeList) result;
  for (int i = 0; i < nodes.getLength(); i++) {
      System.out.println(nodes.item(i).getNodeValue()); 
  }


Код

import java.util.Iterator;
import javax.xml.*;
import javax.xml.namespace.NamespaceContext;

public class PersonalNamespaceContext implements NamespaceContext {

    public String getNamespaceURI(String prefix) {
        if (prefix == null) throw new NullPointerException("Null prefix");
        else if ("pre".equals(prefix)) return "http://www.example.org/books";
        else if ("xml".equals(prefix)) return XMLConstants.XML_NS_URI;
        return XMLConstants.NULL_NS_URI;
    }

    // This method isn't necessary for XPath processing.
    public String getPrefix(String uri) {
        throw new UnsupportedOperationException();
    }

    // This method isn't necessary for XPath processing either.
    public Iterator getPrefixes(String uri) {
        throw new UnsupportedOperationException();
    }

}



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


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
ZMaximI
Дата 5.12.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 18.5.2004
Где: Украина, г. Харьк ов

Репутация: нет
Всего: -1



вот пример, когда ты проходишь по всему дереву :

Код

    public static Boolean getOptions() {
        boolean Result = false;
        try
        {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            
            doc = builder.parse(optionFile);
            Element root = doc.getDocumentElement();
            NodeList children = root.getChildNodes();
            for (int i = 0; i < children.getLength(); i ++)
            {
                Node child = children.item(i);
                if (child instanceof Element)
                {
                    Element childElement = (Element) child;
                    Text textNode = (Text) childElement.getFirstChild();
                    if (childElement.getTagName().equals("InputFilesPath"))
                    {
                        InputFilesPath = textNode.getData().trim();
                        Result = true;
                    }
                    if (childElement.getTagName().equals("OutputFilesPath"))
                    {
                        OutputFilesPath = textNode.getData().trim();
                        Result = true;
                    }                    
                }
            }
        }
        catch (Exception e)
        {
            //
        }
        return Result;
    }


... можешь получать все, что тебе нужно.


--------------------
<удалено администрацией форума>
PM MAIL WWW ICQ   Вверх
nornad
Дата 5.12.2007, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



ZMaximI, а XPath тут каким боком?

Цитата(sith @  5.12.2007,  21:16 Найти цитируемый пост)
.. в это статье http://www.ibm.com/developerworks/xml/libr...vaxpathapi.html  ... есть пример кода  для работы с неймспейсами... но у меня он не работает

Ну, а чего ты привёл код с того сайта, а не свой? Или ты тот код без адаптации на свой хмл натравливал? smile
Насчёт неймспейсов не знаю, но если без них, то тебе надо что-то вроде:
Код

//authors/Author/text()



--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
w1nd
Дата 6.12.2007, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Если хотите уточнять namespace в запросе, его нужно _объявить_. Объявить соответствие префикса и урла namespace:
Код
declare namespace xq='http://xmlbeans.apache.org/samples/xquery/employees'; $this/xq:employees/xq:employee/xq:phone[contains(., '(206)')]


Для получения количества элементов используется функция count():
Код
count($this/xq:employees/xq:employee)


Для выборки первого элемента из множества можно использовать функцию position():
Код
$this/xq:employees/xq:employee[position() = 1]



--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0497 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.