Добавить узел, используя JXPATH

Я использую jxpath для печати всех узлов и добавления дочернего узла в тег функции в этом xml.

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

}

Вторая часть моего требования - это то, что мне нужно

Мне нужно добавить новую запись -- новый узел ‹ feature >3‹ /feature > ПОД существующим тегом <features> под < extract > программно

Это может быть что-то вроде изоляции этого узла, а затем добавления к нему дочернего элемента - я просто не знаю, как это сделать:

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

for (Element node : nodes)
{

}

Любые идеи/помощь будут оценены


person user1432913    schedule 13.06.2012    source источник


Ответы (1)


Это преобразование XSLT:

<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>

при применении к предоставленному XML-документу (исправлено, чтобы сделать правильный формат):

<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>

Пояснение:

Надлежащее использование и переопределение правила идентификации .

person Dimitre Novatchev    schedule 13.06.2012