Как получить значение элемента XML с помощью Java? - PullRequest
43 голосов
/ 02 ноября 2010

Я новичок в XML.Я хочу прочитать следующий XML на основе имени запроса.Пожалуйста, помогите мне, как читать приведенный ниже XML в Java

Ответы [ 9 ]

60 голосов
/ 02 ноября 2010

Если ваш XML является строкой, то вы можете сделать следующее:

String xml = ""; //Populated XML String....

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xml)));
Element rootElement = document.getDocumentElement();

Если ваш XML находится в файле, то экземпляр Document document будет создан следующим образом:

Document document = builder.parse(new File("file.xml"));

document.getDocumentElement() возвращает вам узел, который является элементом документа документа (в вашем случае <config>).

Если у вас есть rootElement, вы можете получить доступ к атрибуту элемента (вызвав rootElement.getAttribute() метод) и т. Д. Дополнительные методы в java org.w3c.dom.Element

Подробнее о java DocumentBuilder & DocumentBuilderFactory . Имейте в виду, , приведенный пример создает дерево DOM XML, поэтому, если у вас огромные данные XML, дерево может быть огромным.


Обновление Вот пример для получения "значения" элемента <requestqueue>

protected String getString(String tagName, Element element) {
        NodeList list = element.getElementsByTagName(tagName);
        if (list != null && list.getLength() > 0) {
            NodeList subList = list.item(0).getChildNodes();

            if (subList != null && subList.getLength() > 0) {
                return subList.item(0).getNodeValue();
            }
        }

        return null;
    }

Вы можете эффективно назвать это как,

String requestQueueName = getString("requestqueue", element);
25 голосов
/ 02 ноября 2010

Если вы просто хотите получить одно значение из XML, вы можете использовать библиотеку Java XPath.Пример см. В моем ответе на предыдущий вопрос:

Это будет выглядеть примерно так:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class Demo {

    public static void main(String[] args) {
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = domFactory.newDocumentBuilder();
            Document dDoc = builder.parse("E:/test.xml");

            XPath xPath = XPathFactory.newInstance().newXPath();
            Node node = (Node) xPath.evaluate("/Request/@name", dDoc, XPathConstants.NODE);
            System.out.println(node.getNodeValue());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
22 голосов
/ 30 июня 2014

В случае, если вам нужно только одно (первое) значение для извлечения из XML:

public static String getTagValue(String xml, String tagName){
    return xml.split("<"+tagName+">")[1].split("</"+tagName+">")[0];
}

Если вы хотите проанализировать весь XML-документ, используйте JSoup:

Document doc = Jsoup.parse(xml, "", Parser.xmlParser());
for (Element e : doc.select("Request")) {
    System.out.println(e);
}
4 голосов
/ 02 ноября 2010

Есть несколько способов сделать это. Возможно, вы захотите проверить XStream или JAXB . Есть учебники и примеры.

1 голос
/ 02 ноября 2010

Есть два основных способа сделать это. Вы либо создадите объектную модель домена для этого XML-файла, посмотрите на this

и второй вариант - это использование управляемого событиями анализа, который является альтернативой представлению DOM xml. Imho, вы можете найти лучшее общее сравнение этих двух основных техник здесь . Конечно, есть еще много информации об обработке XML, например, если вам дано определение схемы XML (XSD), вы можете использовать JAXB .

0 голосов
/ 02 ноября 2010

Вы можете создать класс, который расширяет org.xml.sax.helpers.DefaultHandler и вызывает

start_<tag_name>(Attributes attrs);

и

end_<tag_name>();

Ибо это:

start_request_queue(attrs);

и т.д.

А затем расширяет этот класс и реализует парсеры конфигурационных файлов xml, которые вы хотите. Пример:

  ...
  public void startElement(String uri, String name, String qname,
                           org.xml.sax.Attributes attrs) 
                  throws org.xml.sax.SAXException {
    Class[] args = new Class[2];
    args[0] = uri.getClass();
    args[1] = org.xml.sax.Attributes.class;
    try {
      String mname = name.replace("-", "");
      java.lang.reflect.Method m = 
            getClass().getDeclaredMethod("start" + mname, args);
      m.invoke(this, new Object[] { uri, (org.xml.sax.Attributes)attrs }); 
    }
catch (IllegalAccessException e) { throw new RuntimeException(e); }
catch (NoSuchMethodException e) { throw new RuntimeException(e); }
catch (java.lang.reflect.InvocationTargetException e) { org.xml.sax.SAXException se = new org.xml.sax.SAXException(e.getTargetException()); se.setStackTrace(e.getTargetException().getStackTrace()); }

и в конкретном парсере конфигурации:

   public void start_Request(String uri, org.xml.sax.Attributes attrs) {
     // make sure to read attributes correctly
     System.err.println("Request, name="+ attrs.getValue(0);
   }
0 голосов
/ 02 ноября 2010

Поскольку вы используете это для конфигурации, лучше всего ставить apache commons-configuration . Для простых файлов это намного проще в использовании, чем «сырые» парсеры XML.

См. XML-инструкции

0 голосов
/ 02 ноября 2010

Существуют различные API для чтения / записи файлов XML через Java.Я хотел бы сослаться, используя StaX

Также это может быть полезно - API Java XML

0 голосов
/ 02 ноября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...