如何使用Java检索XML的元素值?

Sam*_*hra 45 java xml

我是XML的新手.我想根据请求名称阅读以下XML.请帮助我如何在Java中阅读以下XML -

<?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>
Run Code Online (Sandbox Code Playgroud)

Buh*_*ndi 62

如果您的XML是String,那么您可以执行以下操作:

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();
Run Code Online (Sandbox Code Playgroud)

如果您的XML在文件中,那么Document document将实例化如下:

Document document = builder.parse(new File("file.xml"));
Run Code Online (Sandbox Code Playgroud)

document.getDocumentElement()你的回报是文档的文档元素节点(你的情况<config>).

一旦你有了rootElement,你可以访问元素的属性(通过调用rootElement.getAttribute()方法)等.有关java的org.w3c.dom.Element的更多方法

有关java DocumentBuilderDocumentBuilderFactory的更多信息.请记住,提供的示例创建了一个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;
    }
Run Code Online (Sandbox Code Playgroud)

你可以有效地称它为,

String requestQueueName = getString("requestqueue", element);
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用内置的Java SE XPath库?http://stackoverflow.com/questions/4076910/how-to-retrieve-element-value-of-xml-using-java/4077986#4077986 (4认同)
  • 很公平,如果有人还在使用JDK 1.4,那么你的方法是合理的.如果它们在1.5或更高版本,则javax.xml.xpath库更容易.当一种更好的方式存在时,我讨厌看到人们以艰难的方式做事. (3认同)

bdo*_*han 26

如果您只是想从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();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)


yur*_*rin 21

如果您只需要从xml检索一个(第一个)值:

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

如果你想解析整个xml文档,请使用JSoup:

Document doc = Jsoup.parse(xml, "", Parser.xmlParser());
for (Element e : doc.select("Request")) {
    System.out.println(e);
}
Run Code Online (Sandbox Code Playgroud)

  • 使用第一种方法但出现 ArrayOutOfBound 异常 (2认同)

pos*_*def 5

有许多不同的方法可以做到这一点。您可能想查看XStreamJAXB。有教程和例子。