有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用xpath查询java读取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="Creation date" type="STRING">2013-11-30, 08:50</ATTRIBUTE>
 <ATTRIBUTE name="Date last changed" type="STRING">2013-11-30, 08:54:46</ATTRIBUTE>

 -<INSTANCE name="Business Opportunities census" id="obj.25615" class="Activity">
 <ATTRIBUTE name="Position" type="STRING">NODE x:6.5cm y:10.5cm index:7</ATTRIBUTE>

 <ATTRIBUTE name="External tool coupling" type="STRING"> </ATTRIBUTE>
 <ATTRIBUTE name="Description" type="STRING">I WANT THIS PARA 1</ATTRIBUTE>


 <ATTRIBUTE name="Version number" type="STRING"> </ATTRIBUTE>
 <ATTRIBUTE name="Author" type="STRING">kvarga</ATTRIBUTE>
 <ATTRIBUTE name="Creation date" type="STRING">2013-11-30, 08:50</ATTRIBUTE>
 <ATTRIBUTE name="Date last changed" type="STRING">2013-11-30, 08:54:46</ATTRIBUTE>

 -<INSTANCE name="Business Opportunities census" id="obj.25615" class="Vess">
 <ATTRIBUTE name="Position" type="STRING">NODE x:6.5cm y:10.5cm index:7</ATTRIBUTE>
 <ATTRIBUTE name="Description" type="STRING">I DONT WANT THIS PARA 2</ATTRIBUTE>
 </INSTANCE>


  </MODEL>

  </MODELS>

  </ADOXML>

嘿,我是xml新手!实际上,我需要的是读取上面的xml文件,以便获得文本

  I WANT THIS PARA 1

我只需要获得这个文本 我的xpath查询是:

 String expression = "/ADOXML/MODELS/MODEL/INSTANCE/ATTRIBUTE[@name='Description' and @type='STRING']";

但我的查询结果如下:

 I WANT THIS PARA 1
 I DONT WANT THIS PARA 2    //this line i dont want

因此,问题是只读取名为description、类型为string的属性标记,但其paraent标记应为instance,其类应为activity

我正在使用以下代码:

  String expression = "/ADOXML/MODELS/MODEL/INSTANCE/ATTRIBUTE[@name='Description' and @type='STRING']";
   NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(document, XPathConstants.NODESET);
   ArrayList<String> text = new ArrayList<String>();

   int k;
 for (k = 0; k < nodeList.getLength(); k++) {

    String txt=nodeList.item(k).getTextContent();
   txt=txt.replace("[","").replace("]","").replace("#","").replace(":", "").replace("•", "").replace("\n", " ")
       .replace("\u0092", " ").replace("'", "").replace("•", " ").replace("-", " ").replace("’", " ").replace("\n", " ");




  text.add(txt);


}

共 (2) 个答案

  1. # 1 楼答案

    试试这根绳子

    String expression = "/ADOXML/MODELS/MODEL/INSTANCE[@class='Activity']/ATTRIBUTE[@name='Description' and @type='STRING']
    
  2. # 2 楼答案

    不首先停止与XPath的匹配;相反,它将返回所有匹配的元素

    你需要弄清楚如何在你想要的东西上更加具体。也许你只是想要第一个INSTANCE

     //INSTANCE[0]/ATTRIBUTE[@name='Description' and @type='STRING']
    

    或者可能是对特定INSTANCE的描述

     //INSTANCE[@id='obj.25615']/ATTRIBUTE[@name='Description' and @type='STRING']
    

    但ID可能非常随机,因此您需要使用实例的名称:

     //INSTANCE[@name='Business Opportunities census']/ATTRIBUTE[@name='Description' and @type='STRING']
    

    注意//将递归搜索匹配项;如果有几个MODEL实例带有Business Opportunities census,那么您还需要找出一种方法来区分它们