2017-10-03 1 views
0

죄송 합니다만 여기 실수하는 것을 보지 못했을 것입니다. XML을 반환하는 낙타 경로가있어서 SpringRunner와 함께 실행되는 JUnit Test를 작성하여 출력을 테스트 할 수 있습니다. XSD에 대해 유효성을 검사하는 교환기에서 XML 스트림을 가져옵니다. 이것은 출력 XML이 유효하지 않기 때문에 XSD가 예외를 throw하기 때문에 훌륭하지만 다음 xquery가 비어있는 NAMESPACE로 요소를 생성하는 이유를 이해할 수 없습니까?xquery 변형은 요소에 빈 네임 스페이스를 만듭니다.

:이 코드를 사용하여 결과 XML은 다음 네임 스페이스 정의와 DATAGROUP 요소를 포함,

declare default element namespace "http://www.dppgroup.com/XXXPMS"; 
let $cmmdoc := $doc/*:cmmdoc 
, $partner := $doc/*:cmmdoc/*:information/*:partner_gruppe/*:partner 
, $sequence:= fn:substring($cmmdoc/@unifier,3) 
return <ClientMMS xmlns:infra="http://www.dppgroup.com/InfraNS"> 
{ 
    for $x in $partner 
    where $x[@partnerStatusCode = " "] 
    return 
    element {"DataGroup" } { 
      <Client sequenceNumber="{$sequence}" /> 
    } 
} 

내 문제는 다음과 같습니다 XQuery에 조각을 (내가 더 많은 코드를 제공 할 수 없습니다 다시 미안 해요) 참조

<?xml version="1.0" encoding="UTF-8"?> 
<ClientMMS xmlns="http://www.dppgroup.com/XXXPMS" 
      xmlns:infra="http://www.dppgroup.com/InfraNS"> 
    <DataGroup xmlns=""> 
     <Client sequenceNumber="170908065609671475"/> 
    </DataGroup> 
</ClientMMS> 

단위 테스트에서 조각을 : 나는 왜 일 이유를 찾을 수없는 XQuery를 소개/튜토리얼/설명에서 jdk1.8_102

String xml = TestDataReader.readXML("/input/info/info_in.xml", PROJECT_ENCODING); 
    quelle.sendBody(xml); 

    boolean valid = false; 
    try { 
     DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 

     ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream((byte[]) archiv.getExchanges().get(1).getIn().getBody()); 
     Document document = documentBuilder.parse(byteArrayInputStream); 

     Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     StreamResult result = new StreamResult(new StringWriter()); 
     DOMSource source = new DOMSource(document); 

     transformer.transform(source, result); 
     String xmlString = result.getWriter().toString(); 
     System.out.println(xmlString); 

을 사용하고 있습니다 일어난다. 여러분은 DataGroup 요소가 기본 네임 스페이스에없는 이유를 설명해 주시겠습니까?

+0

최소, 자체 포함, 실행 가능한 예제로 XQuery를 축소하고 Saxon 또는 Altova에서 실행하려고하면 결과에 네임 스페이스의 언명 인'xmlns = ""'이 없습니다. 그렇다면 어떤 XQuery 구현을 사용합니까? 또한 Java 코드가 어떻게 관련되어 있는지 잘 모르겠지만 일반적으로 네임 스페이스를 인식하지 못하는 기본 네임 스페이스 대신 네임 스페이스 인식 형 문서 작성기를 사용해야하므로 팩토리를 만들기 전에 setNamespaceAware (true)를 설정해야합니다. DocumentBuilder. –

+0

안녕, 너 락! #setNamespaceAware (true)가 누락되었습니다. 그래서 Oxygen XML Developer에서 문제가 발생하지 않았지만 JAVA 코드를 사용했을 때만 javacode를 추가 한 것입니다. 하지만 그 차이가 있는지 없는지 확실하지 않았기 때문에 언급하지 않았습니다 :-). 당신이 내가 당신에게 upvote받을 자격이 있고 해결책으로 의견을 표시하기를 원한다면 대답을 만들어주십시오. 고마워요! –

답변

1

게시 한 XQuery는 표시 할 네임 스페이스 선언을 사용하지 않고도 결과를 잘 작성해야합니다.

Java 코드에서 네임 스페이스로 XML을 사용하려면 네임 스페이스를 인식하는 DocumentBuilder를 사용하십시오. 기본 DocumentBuilderFactory는 네임 스페이스를 인식하지 못하기 때문에 setNamespaceAware(true)을 DocumentBuilder를 만들기 전에 설정해야합니다.

관련 문제