2012-06-13 71 views
1

我使用的JXPath打印所有節點和子節點在該XML添加節點使用的JXPath

<extracts> 
<extract> 
<id>1</id> 
<features> 
<feature>1</feature> 
<feature>2</feature> 
</extract> 
</extracts> 

這是我的代碼看起來像(即工作至少一部分添加到特徵標籤 - 它一些信息打印):

import org.apache.commons.jxpath.ri.model.*; 
    import org.apache.commons.jxpath.JXPathContext; 
    import org.apache.commons.jxpath.Pointer; 


try { 
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
ByteArrayInputStream bais = new ByteArrayInputStream(getBytesFromFile(file)); 
Document doc = builder.parse(bais); 

JXPathContext jxpathCtx = JXPathContext.newContext(doc.getDocumentElement()); 
jxpathCtx.setLenient(true); 

的我的要求的第一部分 - 這是打印這些節點 - 很簡單:

for (Iterator iter2 = jxpathCtx.iterate("/extract/*"); iter2.hasNext();) 
{ 
    System.out.println("\n Value is : " + iter2.next().toString() +"\n"); 

} 

我的要求,第二部分是什麼令我心煩

我需要添加新條目--a新<功能> 3 < /功能下<extract>編程

>節點現有 <features>標記下

這可能是一起孤立節點線的東西 - 然後添加一個孩子 - 我只是不知道如何去做:

org.apache.commons.configuration.HierarchicalConfiguration.NodeNode node = (Node)jxpathCtx.selectNodes("/extract/lastruns/lastrun"); 

for (Element node : nodes) 
{ 

} 

任何想法/幫助將不勝感激

回答

1

這XSLT轉換:當所提供的XML文檔施加

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="feature[last()]"> 
    <xsl:call-template name="identity"/> 
    <feature>3</feature> 
</xsl:template> 
</xsl:stylesheet> 

(校正爲進行良好的形成):

<extracts> 
    <extract> 
     <id>1</id> 
     <features> 
      <feature>1</feature> 
      <feature>2</feature> 
     </features> 
    </extract> 
</extracts> 

產生想要的,正確的結果

<extracts> 
    <extract> 
     <id>1</id> 
     <features> 
     <feature>1</feature> 
     <feature>2</feature> 
     <feature>3</feature> 
     </features> 
    </extract> 
</extracts> 

說明

正確使用和壓倒一切的identity rule