2016-09-07 3 views
0

Я пытаюсь обработать файл bpmn в собственной модели потока. На самом деле, моя проблема вообще не связана с стандартом bpmn, поэтому рассмотрите это как проблему контекста. Я хочу получить узел xml и преобразовать его в String, чтобы впоследствии сохранить базу данных. То, что я пытаюсь сделать в следующем коде, - это получить узел BPMNDiagram, используя xpath, и экспортировать его в строку, но при попытке экспорта я получаю исключение из-за того, что не объявляю пространство имен nsi. Я объявил все пространства имен в предыдущем «запросе» xpath, но как только я получу этот узел и попытаюсь его преобразовать, я получаю описанную ниже ошибку. Часть xpath работает правильно, так как я получаю правильный узел. Проблема возникает на этапе трансформации.Пространство имен, не объявленное при преобразовании XML-узла

XML файла (частичные)

<?xml version="1.0" encoding="UTF-8"?> 
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"  xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.2.1"> 
<bpmn:process id="PP-ProcessProva01" name="ProcesProva" isExecutable="true"> 
... 
</bpmn:process> 
<bpmndi:BPMNDiagram id="BPMNDiagram_1"> 
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="PP-ProcessProva01"> 
    <bpmndi:BPMNShape id="StartEvent_1cp968c_di" bpmnElement="PP_EV_ENTRADA"> 
    <dc:Bounds x="-39" y="143" width="36" height="36" /> 
    <bpmndi:BPMNLabel> 
     <dc:Bounds x="70" y="161" width="90" height="20" /> 
    </bpmndi:BPMNLabel> 
    </bpmndi:BPMNShape> 
    <bpmndi:BPMNShape id="Task_0ogrwwq_di" bpmnElement="PP_AC_VALIDACION"> 
    <dc:Bounds x="241.17552742616033" y="120.96118143459915" width="100" height="80" /> 
    </bpmndi:BPMNShape> 
    <bpmndi:BPMNEdge id="SequenceFlow_1bc244v_di" bpmnElement="EV_TR_PP_EV_ENTRADA-PP_AC_VALIDACION"> 
    <di:waypoint xsi:type="dc:Point" x="-3" y="161" /> 
    <di:waypoint xsi:type="dc:Point" x="241" y="161" /> 
    <bpmndi:BPMNLabel> 
     <dc:Bounds x="21.459854014598534" y="151" width="90" height="20" /> 
    </bpmndi:BPMNLabel> 
    </bpmndi:BPMNEdge> 
</bpmndi:BPMNPlane> 
</bpmndi:BPMNDiagram> 
</bpmn:definitions> 

Это мой код: сообщение

String res=""; 
File file2 = new File("c:\\temp\\prova.bpmn"); 

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
org.w3c.dom.Document doc = dbf.newDocumentBuilder().parse(file2); 

HashMap<String, String> prefMap = new HashMap<String, String>() {{ 
       put("bpmn", "http://www.omg.org/spec/BPMN/20100524/MODEL"); 
       put("bpmndi", "http://www.omg.org/spec/BPMN/20100524/DI"); 
       put("di", "http://www.omg.org/spec/DD/20100524/DI"); 
       put("dc", "http://www.omg.org/spec/DD/20100524/DC"); 
       put("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
       put("camunda", "http://camunda.org/schema/1.0/bpmn"); 
      }}; 
SimpleNamespaceContext namespaces = new SimpleNamespaceContext(prefMap); 

javax.xml.xpath.XPath xpath = XPathFactory.newInstance().newXPath(); 
xpath.setNamespaceContext(namespaces); 
javax.xml.xpath.XPathExpression expr = xpath.compile("/definitions/BPMNDiagram"); 
Node nodeDi = (Node) expr.evaluate(doc,XPathConstants.NODE); 



Transformer t = TransformerFactory.newInstance().newTransformer(); 
t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
t.transform(new DOMSource(nodeDi), new StreamResult(res)); 

Ошибка:

Namespace for prefix 'nsi' has not been declared 

Должен ли я объявить подобным образом пространство имен уровень трансформации? Кто-нибудь, пожалуйста, помогите мне?

Заранее спасибо.

+0

Спасибо! Я только что добавил сообщение об ошибке. – drusilabs

+0

Стопка может быть полезна. Я предполагаю, что здесь, но кажется, что ваш базовый документ недействителен, а не само преобразование (трассировка стека подскажет нам, является ли ошибка, с которой вы сталкиваетесь, на уровне анализа документа или на уровне оценки XPath). – GPI

+1

Обратите внимание, что для XSLT и XPath требуется пространство имен DocumentBuilderFactory, поэтому убедитесь, что вы сначала используете 'setNamespaceAware (true)' на вашем DocumentBuilderFactory перед созданием DocumentBuilders и анализируете документы XML с пространствами имен. –

ответ

0

на основе комментария, сделанного Мартином Honnen я мог бы решить мою проблему:

"Обратите внимание, что XSLT и XPath необходимо пространство имен известно DocumentBuilderFactory поэтому убедитесь, что вы сначала использовать setNamespaceAware (истина) на вашем DocumentBuilderFactory перед созданием DocumentBuilders и анализ XML-документов с пространствами имен "

Смежные вопросы