猿问

从xml节点java生成/获取XPath

从xml节点java生成/获取XPath

我对建议感兴趣伪码代码/解释而不是实际执行.

  • 我想使用xml文档,它的所有节点


  • 检查节点是否存在属性

如果节点没有属性,get/generate String with value of its xpath
如果节点确实有属性,那么可以迭代时隙属性列表,并为每个属性(包括节点)创建XPath。

忠告?希望你能提供一些有用的情报

编辑:

这么做的原因是.。我正在用jmi编写自动化测试,所以对于每个请求,我都需要验证该请求是否完成了它的工作,所以我通过使用XPath获取节点值来断言结果。(额外的信息-无关)

当请求很小时,手工创建断言并不是问题,但对于较大的请求来说,这是一个真正痛苦的问题。(额外信息-无关)

赏金:

我在找java方法

目标

我的目标是从这个ExXML文件中实现以下目标:

<root>
    <elemA>one</elemA>
    <elemA attribute1='first' attribute2='second'>two</elemA>
    <elemB>three</elemB>
    <elemA>four</elemA>
    <elemC>
        <elemB>five</elemB>
    </elemC></root>

制作下列文件:

//root[1]/elemA[1]='one'//root[1]/elemA[2]='two'//root[1]/elemA[2][@attribute1='first']//root[1]/elemA[2][@attribute2='second']
//root[1]/elemB[1]='three'//root[1]/elemA[3]='four'//root[1]/elemC[1]/elemB[1]='five'

解释:

  • 如果节点值/文本不是空/零,则获取XPath,为断言目的添加=‘nodevalue’
  • 如果节点有属性,那么也为它们创建断言

赏金更新:

我找到了这个例子,它没有产生正确的结果,但是我看起来如下所示:

http:/www.coderanch.com/how-to/java/SAXCreateXPath


函数式编程
浏览 864回答 3
3回答

烙印99

下面是如何使用SAX来完成这一任务:import&nbsp;java.util.HashMap;import&nbsp;java.util.Map;import&nbsp;org.xml.sax.Attributes;import&nbsp;org.xml.sax.SAXException;import&nbsp;org.xml. sax.XMLReader;import&nbsp;org.xml.sax.helpers.DefaultHandler;public&nbsp;class&nbsp;FragmentContentHandler&nbsp;extends&nbsp;DefaultHandler&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;xPath&nbsp;=&nbsp;"/"; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;XMLReader&nbsp;xmlReader; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;FragmentContentHandler&nbsp;parent; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;StringBuilder&nbsp;characters&nbsp;=&nbsp;new&nbsp;StringBuilder(); &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Map<String,&nbsp;Integer>&nbsp;elementNameCount&nbsp;=&nbsp;new&nbsp;HashMap<String,&nbsp;Integer>(); &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;FragmentContentHandler(XMLReader&nbsp;xmlReader)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.xmlReader&nbsp;=&nbsp;xmlReader; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;FragmentContentHandler(String&nbsp;xPath,&nbsp;XMLReader&nbsp;xmlReader,&nbsp;FragmentContentHandler&nbsp;parent)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this(xmlReader); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.xPath&nbsp;=&nbsp;xPath; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.parent&nbsp;=&nbsp;parent; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;startElement(String&nbsp;uri,&nbsp;String&nbsp;localName,&nbsp;String&nbsp;qName,&nbsp;Attributes&nbsp;atts)&nbsp;throws&nbsp;SAXException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;count&nbsp;=&nbsp;elementNameCount.get(qName); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(null&nbsp;==&nbsp;count)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;=&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elementNameCount.put(qName,&nbsp;count); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;childXPath&nbsp;=&nbsp;xPath&nbsp;+&nbsp;"/"&nbsp;+&nbsp;qName&nbsp;+&nbsp;"["&nbsp;+&nbsp;count&nbsp;+&nbsp;"]"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;attsLength&nbsp;=&nbsp;atts.getLength(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;x=0;&nbsp;x<attsLength;&nbsp;x++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(childXPath&nbsp;+&nbsp;"[@"&nbsp;+&nbsp;atts.getQName(x)&nbsp;+&nbsp;"='"&nbsp;+&nbsp;atts.getValue(x)&nbsp;+&nbsp;']'); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FragmentContentHandler&nbsp;child&nbsp;=&nbsp;new&nbsp;FragmentContentHandler(childXPath,&nbsp;xmlReader,&nbsp;this); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlReader.setContentHandler(child); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;endElement(String&nbsp;uri,&nbsp;String&nbsp;localName,&nbsp;String&nbsp;qName)&nbsp;throws&nbsp;SAXException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;characters.toString().trim(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(value.length()&nbsp;>&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(xPath&nbsp;+&nbsp;"='"&nbsp;+&nbsp;characters.toString()&nbsp;+&nbsp;"'"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlReader.setContentHandler(parent); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;characters(char[]&nbsp;ch,&nbsp;int&nbsp;start,&nbsp;int&nbsp;length)&nbsp;throws&nbsp;SAXException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;characters.append(ch,&nbsp;start,&nbsp;length); &nbsp;&nbsp;&nbsp;&nbsp;}}它可以通过以下方法进行测试:import&nbsp;java.io.FileInputStream;import&nbsp;javax.xml.parsers.SAXParser;import&nbsp;javax.xml.parsers.SAXParserFactory;import&nbsp;org.xml. sax.InputSource;import&nbsp;org.xml.sax.XMLReader;public&nbsp;class&nbsp;Demo&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXParserFactory&nbsp;spf&nbsp;=&nbsp;SAXParserFactory.newInstance(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXParser&nbsp;sp&nbsp;=&nbsp;spf.newSAXParser(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLReader&nbsp;xr&nbsp;=&nbsp;sp.getXMLReader(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xr.setContentHandler(new&nbsp;FragmentContentHandler(xr)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xr.parse(new&nbsp;InputSource(new&nbsp;FileInputStream("input.xml"))); &nbsp;&nbsp;&nbsp;&nbsp;}}这将产生所需的输出://root[1]/elemA[1]='one'//root[1]/elemA[2][@attribute1='first]//root[1]/elemA[2][@attribute2='second]//root[1]/elemA[2]=' two'//root[1]/elemB[1]='three'//root[1]/elemA[3]='four'//root[1]/elemC[1]/elemB[1]='five'

慕后森

带着jOOX(A)jQueryAPI端口到Java,免责声明-我为库后面的公司工作),您几乎可以在一条语句中实现您想要的结果://&nbsp;I'm&nbsp;assuming&nbsp;this:import&nbsp;static&nbsp;org.joox.JOOX.$;//&nbsp;And&nbsp;then...List<String>&nbsp;coolList&nbsp;=&nbsp;$(document).xpath("//*[not(*)]").map( &nbsp;&nbsp;&nbsp;&nbsp;context&nbsp;->&nbsp;$(context).xpath()&nbsp;+&nbsp;"='"&nbsp;+&nbsp;$(context).text()&nbsp;+&nbsp;"'");如果文档是您的示例文档:<root> &nbsp;&nbsp;&nbsp;&nbsp;<elemA>one</elemA> &nbsp;&nbsp;&nbsp;&nbsp;<elemA&nbsp;attribute1='first'&nbsp;attribute2='second'>two</elemA> &nbsp;&nbsp;&nbsp;&nbsp;<elemB>three</elemB> &nbsp;&nbsp;&nbsp;&nbsp;<elemA>four</elemA> &nbsp;&nbsp;&nbsp;&nbsp;<elemC> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<elemB>five</elemB> &nbsp;&nbsp;&nbsp;&nbsp;</elemC></root>这将产生/root[1]/elemA[1]='one' /root[1]/elemA[2]='two' /root[1]/elemB[1]='three' /root[1]/elemA[3]='four' /root[1]/elemC[1]/elemB[1]='five'所谓“几乎”,我的意思是jOOX不支持匹配/映射属性。因此,属性不会产生任何输出。不过,这将在不久的将来实施。
随时随地看视频慕课网APP

相关分类

Java
我要回答