Как получить значение элемента 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>
9 ответов
Если ваш 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's org.w3c.dom.Element
Больше информации о java DocumentBuilder и DocumentBuilderFactory. Помните, что приведенный пример создает дерево XML DOM, поэтому, если у вас есть огромные данные 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);
В случае, если вам просто нужно одно (первое) значение для извлечения из 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);
}
Если вы просто хотите получить единственное значение из 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();
}
}
}
Если XML правильно сформирован, вы можете преобразовать его в документ. Используя XPath, вы можете получить элементы XML.
String xml = "<stackusers><name>Yash</name><age>30</age></stackusers>";
Сформируйте XML-String Create Document и найдите элементы, используя его XML-Path.
Document doc = getDocument(xml, true);
public static Document getDocument(String xmlData, boolean isXMLData) throws Exception {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setNamespaceAware(true);
dbFactory.setIgnoringComments(true);
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc;
if (isXMLData) {
InputSource ips = new org.xml.sax.InputSource(new StringReader(xmlData));
doc = dBuilder.parse(ips);
} else {
doc = dBuilder.parse( new File(xmlData) );
}
return doc;
}
Использовать
org.apache.xpath.XPathAPI
чтобы получить Node или NodeList.
System.out.println("XPathAPI:"+getNodeValue(doc, "/stackusers/age/text()"));
NodeList nodeList = getNodeList(doc, "/stackusers");
System.out.println("XPathAPI NodeList:"+ getXmlContentAsString(nodeList));
System.out.println("XPathAPI NodeList:"+ getXmlContentAsString(nodeList.item(0)));
public static String getNodeValue(Document doc, String xpathExpression) throws Exception {
Node node = org.apache.xpath.XPathAPI.selectSingleNode(doc, xpathExpression);
String nodeValue = node.getNodeValue();
return nodeValue;
}
public static NodeList getNodeList(Document doc, String xpathExpression) throws Exception {
NodeList result = org.apache.xpath.XPathAPI.selectNodeList(doc, xpathExpression);
return result;
}
С помощью
javax.xml.xpath.XPathFactory
System.out.println("javax.xml.xpath.XPathFactory:"+getXPathFactoryValue(doc, "/stackusers/age"));
static XPath xpath = javax.xml.xpath.XPathFactory.newInstance().newXPath();
public static String getXPathFactoryValue(Document doc, String xpathExpression) throws XPathExpressionException, TransformerException, IOException {
Node node = (Node) xpath.evaluate(xpathExpression, doc, XPathConstants.NODE);
String nodeStr = getXmlContentAsString(node);
return nodeStr;
}
Использование элемента документа.
System.out.println("DocumentElementText:"+getDocumentElementText(doc, "age"));
public static String getDocumentElementText(Document doc, String elementName) {
return doc.getElementsByTagName(elementName).item(0).getTextContent();
}
Получите значение между двумя строками.
String nodeVlaue = org.apache.commons.lang.StringUtils.substringBetween(xml, "<age>", "</age>");
System.out.println("StringUtils.substringBetween():"+nodeVlaue);
Полный пример:
public static void main(String[] args) throws Exception {
String xml = "<stackusers><name>Yash</name><age>30</age></stackusers>";
Document doc = getDocument(xml, true);
String nodeVlaue = org.apache.commons.lang.StringUtils.substringBetween(xml, "<age>", "</age>");
System.out.println("StringUtils.substringBetween():"+nodeVlaue);
System.out.println("DocumentElementText:"+getDocumentElementText(doc, "age"));
System.out.println("javax.xml.xpath.XPathFactory:"+getXPathFactoryValue(doc, "/stackusers/age"));
System.out.println("XPathAPI:"+getNodeValue(doc, "/stackusers/age/text()"));
NodeList nodeList = getNodeList(doc, "/stackusers");
System.out.println("XPathAPI NodeList:"+ getXmlContentAsString(nodeList));
System.out.println("XPathAPI NodeList:"+ getXmlContentAsString(nodeList.item(0)));
}
public static String getXmlContentAsString(Node node) throws TransformerException, IOException {
StringBuilder stringBuilder = new StringBuilder();
NodeList childNodes = node.getChildNodes();
int length = childNodes.getLength();
for (int i = 0; i < length; i++) {
stringBuilder.append( toString(childNodes.item(i), true) );
}
return stringBuilder.toString();
}
Вывод:
StringUtils.substringBetween():30
DocumentElementText:30
javax.xml.xpath.XPathFactory:30
XPathAPI:30
XPathAPI NodeList:<stackusers>
<name>Yash</name>
<age>30</age>
</stackusers>
XPathAPI NodeList:<name>Yash</name><age>30</age>
Следующие ссылки могут помочь
http://labe.felk.cvut.cz/~xfaigl/mep/xml/java-xml.htm
Существуют различные API для чтения / записи файлов XML через Java. Я бы сослался на использование StaX
Также это может быть полезно - API Java XML
Есть два основных способа сделать это. Вы либо создадите доменную объектную модель этого XML-файла, посмотрите на это
и второй вариант - использовать управляемый событиями анализ, который является альтернативой представлению DOM xml. Imho, вы можете найти лучшее общее сравнение этих двух основных методов здесь. Конечно, есть еще много информации об обработке XML, например, если вам дано определение схемы XML (XSD), вы можете использовать JAXB.
Поскольку вы используете это для настройки, лучше всего будет использовать Apache http://commons.apache.org/configuration/. Для простых файлов это намного проще в использовании, чем "сырые" парсеры XML.
Смотрите инструкции по XML
Вы можете создать класс, который расширяет 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 ("начало " + mname, аргументы); m.invoke (this, new Object [] {uri, (org.xml.sax.Attributes) attrs}); }
catch (IllegalAccessException e) {выбросить новое RuntimeException (e); }
catch (NoSuchMethodException e) {выбросить новое 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 (Строка uri, org.xml.sax.Attributes attrs) { // убедитесь, что правильно прочитали атрибуты System.err.println ("Запрос, имя ="+ attrs.getValue(0); }