Подтвердить что ты не робот

Как получить значение элемента XML с помощью Java?

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

<?xml version="1.0"?>
    <config>
        <Request name="ValidateEmailRequest">
            <requestqueue>emailrequest</requestqueue>
            <responsequeue>emailresponse</responsequeue>
        </Request>
        <Request name="CleanEmail">
            <requestqueue>Cleanrequest</requestqueue>
            <responsequeue>Cleanresponse</responsequeue>
        </Request>
    </config>
4b9b3361

Ответ 1

Если ваш 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() возвращает node, который является элементом документа документа (в вашем случае <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);

Ответ 2

Если вы просто хотите получить одно значение из 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();
        }
    }

}

Ответ 3

Если вам просто нужно одно (первое) значение для извлечения из 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

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

Ответ 5

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

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

Ответ 7

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

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

Ответ 8

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

См. Практическое руководство XML

Ответ 9

Вы можете создать класс, который расширяет 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 {   Класс [] args = новый класс [2];   args [0] = uri.getClass();   args [1] = org.xml.sax.Attributes.class;   пытаться {     String mname = name.replace( "-", ");     java.lang.reflect.Method m =           getClass(). getDeclaredMethod (" start" + mname, args);     m.invoke(это, новый 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) {    // убедитесь, что правильно прочитали атрибуты    System.err.println( "Запрос, name=" + attrs.getValue(0);  }