2016-09-03 15 views
0

"javax.xml.xpath.XPath"を使用して2つのxmlをマージしようとしています。XPATHを使用したXMLのマージ

送信元と宛先の両方のXMLが次のように表示されます。この

以下
<?xml version="1.0" encoding="UTF-8"?> 
<bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn"> 
    <bpmn:collaboration id="Collaboration_1ah989h"> 
    <bpmn:participant id="Participant_108if28" processRef="Process_2" /> 
    </bpmn:collaboration> 

    <bpmn:process id="Process_1" isExecutable="false">** 
    <bpmn:startEvent id="StartEvent_1"> 
    <bpmn:outgoing>SequenceFlow_1i0zw0x</bpmn:outgoing> 
    </bpmn:startEvent> 
    <bpmn:intermediateThrowEvent id="IntermediateThrowEvent_00epl00"> 
    <bpmn:incoming>SequenceFlow_1i0zw0x</bpmn:incoming> 
    <bpmn:outgoing>SequenceFlow_05qx4z2</bpmn:outgoing> 
    </bpmn:intermediateThrowEvent> 
    </bpmn:process> 

</bpmn:definitions> 

は、XMLに問題がある

Document destination= (Document) xpath.evaluate("/", new InputSource("C:/diagram_Sec.bpmn"), XPathConstants.NODE); 

NodeList listPosts = (NodeList) xpath.evaluate("//bpmn:process//*",new InputSource("C:/diagram_Fir.xml"), XPathConstants.NODESET); 

Element element= (Element) xpath.evaluate("//bpmn:process", destination, XPathConstants.NODE); 

for (int i = 0; i < listPosts.getLength(); i++) { 

    Node listPost = listPosts.item(i); 
    Element element = (Element) listPost; 

    AttributeMap map = (AttributeMap) element.getAttributes(); 
    for(int j=0;j<map.getLength();j++) 
    { 
    element.setAttribute(map.item(j).getLocalName(), map.item(j).getNodeValue()); 

    } 
     Node node = xml1.adoptNode(element); 
     blog.appendChild(node); 

} 

    DOMImplementationLS impl = (DOMImplementationLS) xml1.getImplementation(); 
    System.out.println(impl.createLSSerializer().writeToString(destination)); 

をマージするために使用されるコードである第一のxmlに2つ目のXMLで:「プロセスBPMN」 iは、すべてのノードを追加したいですコードは "bpmn:process"タグのすべての子ノードを別個のノードと見なし、 "bpmn:process"の直下に配置します(すべての子ノードも "bpmn:process"になります)。出力はこの

<bpmn:process id="Process_1" isExecutable="false"> 
//Here comes First xml nodes 

    //Second XML Content after merge 
<bpmn:startEvent id="StartEvent_1"> 
</bpmn:startEvent> 

**//This tag should be inside bpmn:startEvent tag** 
<bpmn:outgoing>SequenceFlow_1i0zw0x</bpmn:outgoing> 

<bpmn:intermediateThrowEvent id="IntermediateThrowEvent_00epl00"> 
</bpmn:intermediateThrowEvent> 

**//THis should be inside above bpmn:intermediateThrowEvent tag** 
<bpmn:incoming>SequenceFlow_1i0zw0x</bpmn:incoming> 
</bpmn:process 

のように見えるが予想される、私はこれを行うための正しい方法を教えてください

<bpmn:process id="Process_1" isExecutable="false"> 
//Here comes First xml Children 

    //Second XML Content 
<bpmn:startEvent id="StartEvent_1"> 
    // outgoing is Inside bpmn:startEvent tag 
**<bpmn:outgoing>SequenceFlow_1i0zw0x</bpmn:outgoing>** 
</bpmn:startEvent> 

<bpmn:intermediateThrowEvent id="IntermediateThrowEvent_00epl00"> 
// Inside bpmn:intermediateThrowEvent tag 
<bpmn:incoming>SequenceFlow_1i0zw0x</bpmn:incoming> 
</bpmn:intermediateThrowEvent> 

</bpmn:process 

です。

おかげで、

+0

xmlを1つではなく両方表示できますか? –

答えて

0

XPathは、読み取り専用の言語です:あなたは、新しいXMLツリーを構築するためにそれを使用することはできません。そのためには、XSLTまたはXQueryが必要です。それとも、もしあなたが本当にそれを落としたいのであれば、DOM。

しかし、これはXSLTでは非常に簡単で、DOMを使用すると実際には労力がかかるようです。 XSLTでは、2つのテンプレートルールが必要です:すべてをコピーするための標準アイデンティティルールとルールを追加しました。

<xsl:template match="bpmn:process"> 
    <xsl:copy-of select="."/> 
    <xsl:copy-of select="document('second.xml')//bpmn:process"/> 
</xsl:template> 
+0

こんにちはMichael、提案してくれてありがとう、私はXSLTを使用してみます。 – kumar

関連する問題