首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用XPath Java在标记中读取

使用XPath Java在标记中读取
EN

Stack Overflow用户
提问于 2014-03-13 08:05:28
回答 2查看 485关注 0票数 0

我刚开始使用Java读取XML,我的问题是,我一直在尝试读取xml,在特定的标记之间,我想要获得所需的数据,我正在使用XPath,而我的查询是:

代码语言:javascript
运行
复制
   String expression = "/ADOXML/MODELS/MODEL/MODELATTRIBUTES/ATTRIBUTE[@type='STRING']";

它工作得很好,我的特定标记可以从以下位置读取:

代码语言:javascript
运行
复制
   <ATTRIBUTE name="Description" type="STRING"> SOME TEXT </ATTRIBUTE>

但是我只想在这些类型的标记中读取数据,这样我的输出应该是:

代码语言:javascript
运行
复制
  SOME TEXT

在标签里面!有人能帮我吗?我怎么能做到这一点?我刚开始读xml!尽我最大的努力:

代码语言:javascript
运行
复制
  String expression = "/ADOXML/MODELS/MODEL/MODELATTRIBUTES/ATTRIBUTE[@name='Description' and ./type/text()='STRING']";

但是它不会给我任何输出!提前感谢

我的守则:

代码语言:javascript
运行
复制
   DocumentBuilderFactory builderFactory =
    DocumentBuilderFactory.newInstance();
  DocumentBuilder builder = null;
try {

builder = builderFactory.newDocumentBuilder();
        org.w3c.dom.Document document = builder.parse(
        new FileInputStream("c:\\y.xml"));

        XPath xPath =  XPathFactory.newInstance().newXPath();

       String expression = "/ADOXML/MODELS/MODEL/MODELATTRIBUTES/ATTRIBUTE[@name='Description'and @type='STRING']";
   System.out.println(expression);
   NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
System.out.println(nodeList.item(i).getFirstChild().getNodeValue()); 
}


} catch (ParserConfigurationException | SAXException | IOException e) {
System.out.print(e);
}       

我的代码出了问题,搞不清楚是什么!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-13 08:24:13

这段代码在修改后的XPath中运行良好,可以:

"/ADOXML/MODELS/MODEL/MODELATTRIBUTES/ATTRIBUTE[@name='Description'][@type='STRING']"

代码语言:javascript
运行
复制
private static final String EXAMPLE_XML =
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
        "<ADOXML adoversion=\"Version 5.1\" username=\"kvarga\" database=\"adonisdb\" time=\"08:55\"   date=\"30.11.2013\" version=\"3.1\">" +
            "<MODELS>" +
                "<MODEL version=\"\" applib=\"ADONIS BPMS BP Library 5.1\" libtype=\"bp\" modeltype=\"Business process model\" name=\"Product development\" id=\"mod.25602\">" +
                    "<MODELATTRIBUTES>" +
                        "<ATTRIBUTE name=\"Version number\" type=\"STRING\"> </ATTRIBUTE>" +
                        "<ATTRIBUTE name=\"Author\" type=\"STRING\">kvarga</ATTRIBUTE>" +
                        "<ATTRIBUTE name=\"Description\" type=\"STRING\">I WANT THIS PARA 2</ATTRIBUTE>" +
                    "</MODELATTRIBUTES>" +
                "</MODEL>" +
            "</MODELS>" +
        "</ADOXML>";

public static void main(String[] args) {
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = null;
    try {
        builder = builderFactory.newDocumentBuilder();
        Document document = builder.parse(new ByteArrayInputStream(EXAMPLE_XML.getBytes()));
        XPath xPath =  XPathFactory.newInstance().newXPath();
        String expression = "/ADOXML/MODELS/MODEL/MODELATTRIBUTES/ATTRIBUTE[@name='Description'][@type='STRING']";
        NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(document, XPathConstants.NODESET);
        for (int i = 0; i < nodeList.getLength(); i++) {
            System.out.println("###" + nodeList.item(i).getFirstChild().getNodeValue() + "###");
        }
    } catch (Exception e) {
        System.out.print(e);
    }
}

产出:

代码语言:javascript
运行
复制
###I WANT THIS PARA 2###
票数 0
EN

Stack Overflow用户

发布于 2014-03-13 08:38:19

上述代码工作正常。

你也可以尝试其他方法来获取文本节点-

代码语言:javascript
运行
复制
String expression = "/ADOXML/MODELS/MODEL/MODELATTRIBUTES/ATTRIBUTE/text()";

NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(document, XPathConstants.NODESET);

System.out.println(nodeList.item(0).getNodeValue());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22372533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档