【问题标题】:Read inside a Tag using XPath Java使用 XPath Java 读取标签内部
【发布时间】:2014-03-13 08:05:28
【问题描述】:

嘿,我是使用 Java 读取 XML 文件的新手,我的问题是我一直在尝试读取 xml,并且在特定标签之间我想获取所需的数据,我正在使用 XPath,我的查询是:

   String expression = "/ADOXML/MODELS/MODEL/MODELATTRIBUTES/ATTRIBUTE[@type='STRING']";

它工作正常,我要读取的特定标签是:

   <ATTRIBUTE name="Description" type="STRING"> SOME TEXT </ATTRIBUTE>

但我只想读取这些类型的标签中的数据,因此我的输出应该是:

  SOME TEXT

在标签里面! 有人可以帮助我我该怎么做请我是 xml 阅读的新手!尽我所能:

  String expression = "/ADOXML/MODELS/MODEL/MODELATTRIBUTES/ATTRIBUTE[@name='Description' and ./type/text()='STRING']";

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

我的代码:

   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);
}       

我的代码有问题,无法弄清楚是什么!

【问题讨论】:

    标签: java xml xpath


    【解决方案1】:

    这个代码对我来说很好,将 XPath 更改为:

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

    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);
        }
    }
    

    输出:

    ###I WANT THIS PARA 2###
    

    【讨论】:

    • 大声笑你怎么能说即使你在阅读问题后发布我也必须阅读一个 xml 文件然后想要获取标签内的数据大声笑
    • 对不起,我不明白你的评论。我没有您使用的 XML,因此我使用了内存示例和您的代码。有了这个例子,一切正常。因此,关于您读入的 XML 文档,您的 XPath 可能不正确。如果您也喜欢发布 XML 文档。对不起,如果我错过了什么。
    • 想要我提供 xml
    • 您希望与 XPath 匹配的 XML 或 XSD 或截断的 XML。
    • 我已经发布了我的 xml 部分
    【解决方案2】:

    上述代码运行良好。

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

    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());
    

    【讨论】:

    • 不知道什么意思
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    相关资源
    最近更新 更多