從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
3 回答

烙印99
TA貢獻1829條經驗 獲得超13個贊
import java.util.HashMap;import java.util.Map;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml. sax.XMLReader;import org.xml.sax.helpers.DefaultHandler;public class FragmentContentHandler extends DefaultHandler { private String xPath = "/"; private XMLReader xmlReader; private FragmentContentHandler parent; private StringBuilder characters = new StringBuilder(); private Map<String, Integer> elementNameCount = new HashMap<String, Integer>(); public FragmentContentHandler(XMLReader xmlReader) { this.xmlReader = xmlReader; } private FragmentContentHandler(String xPath, XMLReader xmlReader, FragmentContentHandler parent) { this(xmlReader); this.xPath = xPath; this.parent = parent; } @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { Integer count = elementNameCount.get(qName); if(null == count) { count = 1; } else { count++; } elementNameCount.put(qName, count); String childXPath = xPath + "/" + qName + "[" + count + "]"; int attsLength = atts.getLength(); for(int x=0; x<attsLength; x++) { System.out.println(childXPath + "[@" + atts.getQName(x) + "='" + atts.getValue(x) + ']'); } FragmentContentHandler child = new FragmentContentHandler(childXPath, xmlReader, this); xmlReader.setContentHandler(child); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { String value = characters.toString().trim(); if(value.length() > 0) { System.out.println(xPath + "='" + characters.toString() + "'"); } xmlReader.setContentHandler(parent); } @Override public void characters(char[] ch, int start, int length) throws SAXException { characters.append(ch, start, length); }}
import java.io.FileInputStream;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml. sax.InputSource;import org.xml.sax.XMLReader;public class Demo { public static void main(String[] args) throws Exception { SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader xr = sp.getXMLReader(); xr.setContentHandler(new FragmentContentHandler(xr)); xr.parse(new InputSource(new FileInputStream("input.xml"))); }}
//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'

慕后森
TA貢獻1802條經驗 獲得超5個贊
// I'm assuming this:import static org.joox.JOOX.$;// And then...List<String> coolList = $(document).xpath("//*[not(*)]").map( context -> $(context).xpath() + "='" + $(context).text() + "'");
<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]/elemB[1]='three' /root[1]/elemA[3]='four' /root[1]/elemC[1]/elemB[1]='five'
添加回答
舉報
0/150
提交
取消