2016-11-15 13 views
2

次のXML文字列があります。JDOMを使用したXML分割Java

<Engineers> 
    <Engineer> 
     <Name>JOHN</Name> 
     <Position>STL</Position> 
     <Team>SS</Team> 
    </Engineer> 
    <Engineer> 
     <Name>UDAY</Name> 
     <Position>TL</Position> 
     <Team>SG</Team> 
    </Engineer> 
    <Engineer> 
     <Name>INDRA</Name> 
     <Position>Director</Position> 
     <Team>PP</Team> 
    </Engineer> 
</Engineers> 

XpathがEngineers/Enginnerとして指定されている場合、このxmlをより小さいxml文字列に分割する必要があります。私はサクソンのXPathとJDOMを使用して、以下の実施している

<Engineer> 
     <Name>INDRA</Name> 
     <Position>Director</Position> 
     <Team>PP</Team> 
    </Engineer> 

<Engineer> 
     <Name>JOHN</Name> 
     <Position>STL</Position> 
     <Team>SS</Team> 
</Engineer> 

を次のように

小規模なXML文字列です。

import net.sf.saxon.Configuration; 
import net.sf.saxon.lib.NamespaceConstant; 
import net.sf.saxon.om.DocumentInfo; 
import net.sf.saxon.om.NodeInfo; 
import net.sf.saxon.s9api.DocumentBuilder; 
import net.sf.saxon.s9api.XPathCompiler; 
import net.sf.saxon.s9api.XPathSelector; 
import net.sf.saxon.s9api.XdmNode; 
import net.sf.saxon.xpath.XPathFactoryImpl; 
import org.apache.axiom.om.OMElement; 
import org.apache.axiom.om.impl.builder.StAXOMBuilder; 
import org.junit.Test; 
import org.xml.sax.InputSource; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.StringReader; 
import java.util.Iterator; 
import java.util.List; 
import javax.xml.transform.sax.SAXSource; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathExpression; 
import javax.xml.xpath.XPathExpressionException; 
import javax.xml.xpath.XPathFactory; 
import javax.xml.xpath.XPathFactoryConfigurationException; 

public void testXML() throws XPathFactoryConfigurationException, XPathExpressionException, Exception { 

     System.setProperty("javax.xml.xpath.XPathFactory:" + NamespaceConstant.OBJECT_MODEL_JDOM, 
       "net.sf.saxon.xpath.XPathFactoryImpl"); 
     XPathFactory xPathFactory = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_JDOM); 
     XPath xPath = xPathFactory.newXPath(); 
     InputSource inputSource = new InputSource(new File(filename).toURI().toString()); 
     SAXSource saxSource = new SAXSource(inputSource); 
     Configuration config = ((XPathFactoryImpl) xPathFactory).getConfiguration(); 
     DocumentInfo document = config.buildDocument(saxSource); 
     XPathExpression xPathExpression = xPath.compile("//Engineers/Engineer"); 
     List matches = (List) xPathExpression.evaluate(document, XPathConstants.NODESET); 
     if (matches != null) { 
      for (Iterator iter = matches.iterator(); iter.hasNext();) { 
       NodeInfo node = (NodeInfo) iter.next(); 
       System.out.println(node.getDisplayName() + " - " + node.getStringValue()); 
      } 
     } 

    } 

以下の結果が得られます。私は私の所望の出力を得るように、私は、コードを変更するか、それとも子供はあなたが使用している場合はエンジニア

答えて

1

内(名前、ポジション、チームを)属性の名前を取得する方法があることができますどのように

Engineer - 
     JOHN 
     STL 
     SS 

Engineer - 
     UDAY 
     TL 
     SG 

Engineer - 
     INDRA 
     Director 
     PP 

この作業のためのJDOMでは、抽象化の代わりにネイティブJDOMメソッドを使用することを検討してください。私はXSLTで分割を行うだろう

import org.jdom2.Document; 
import org.jdom2.Element; 
import org.jdom2.xpath.XPathFactory; 
import org.jdom2.xpath.XPAthExpression; 
import org.jdom2.output.XMLOutputter; 
import org.jdom2.input.SAXBuilder; 
import org.jdom2.filter.Filters; 

.... 

    XPathExpression xpe = XPathFactory.instance() 
     .compile("//Engineers/Engineer", Filters.element()); 

    Document doc = new SAXBuilder().build(new File(filename)); 

    XMLOutputter xout = new XMLOutputter(Format.getPrettyFormat()); 

    for (Element e : xpe.evaluate(doc)) { 
     xout.output(e, System.out); 
    } 
1

<xsl:stylesheet ....> 
<xsl:template match="Engineeers/Engineer"> 
    <xsl:result-document href="{position()}.xml"> 
    <xsl:copy-of select="."/> 
    </xsl:result-document> 
</xsl:template> 
</xsl:stylesheet> 

あなたはJDOM文書のリストとして結果を望むなら、あなたはOutputURIResolverとサクソンを供給することができ

のようなものを考えてみます。

であり、結果はjdomDocumentsである。

関連する問題