SAXFilter를 사용하여 SOAP 응답의 네임 스페이스를 제거 할 수 없습니다.

J888

유효한 응답이 아니기 때문에 다음 SOAP 응답을 구문 분석하려고합니다. 다음 필터를 사용하여 네임 스페이스를 제거하려고하지만 오류가 발생합니다.

응답

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <SearchFlightsResponse xmlns="ElsyArres.API">
            <SoapMessage>
                <Username>TEST</Username>
                <Password>TESTs</Password>
                <LanguageCode>EN</LanguageCode>
                <ErrorMessage />
                <ErrorCode>0</ErrorCode>
                <AppVersion>8.0.3</AppVersion>
                <Request>
                    <Departure>FDH</Departure>
                    <Destination>HAM</Destination>
                    <DepartureDate>2014-08-08</DepartureDate>
                    <ReturnDate />
                    <NumADT>1</NumADT>
                    <NumINF>0</NumINF>
                    <NumCHD>0</NumCHD>
                    <CurrencyCode>EUR</CurrencyCode>
                    <CarrierList />
                    <FareClasses />
                    <Providers />
                    <WaitForResult>true</WaitForResult>
                    <NearbyDepartures>true</NearbyDepartures>
                    <NearbyDestinations>true</NearbyDestinations>
                    <RROnly>false</RROnly>
                    <MetaSearch>true</MetaSearch>
                </Request>
                <Response>
                    <SearchFlightId>140514114543-02-43064-52</SearchFlightId>
                    <Roundtrip>false</Roundtrip>
                    <CurrencyCode>EUR</CurrencyCode>
                    <Flights>
                        <Flight>
                            <Outbound>
                                <CarName>Inter Sky</CarName>
                                <CarCode>3L</CarCode>
                                <DepName>Friedrichshafen</DepName>
                                <DepCode>FDH</DepCode>
                                <DestName>Hamburg</DestName>
                                <DestCode>HAM</DestCode>
                                <Duration>01:45</Duration>
                                <FlightNo>3L370</FlightNo>
                                <DepDateTime>2014-08-08T06:10:00</DepDateTime>
                                <ArrDateTime>2014-08-08T07:55:00</ArrDateTime>
                                <Legs>
                                    <Leg>
                                        <Sequence>0</Sequence>
                                        <FlightNo>3L370</FlightNo>
                                        <DepCode>FDH</DepCode>
                                        <DepName>Friedrichshafen</DepName>
                                        <DestCode>HAM</DestCode>
                                        <DestName>Hamburg</DestName>
                                        <DepTime>06:10</DepTime>
                                        <ArrTime>07:55</ArrTime>
                                        <CarCode>3L</CarCode>
                                        <CarName>Inter Sky</CarName>
                                        <FareClass>Economy</FareClass>
                                        <ArrDateTime>2014-08-08T07:55:00</ArrDateTime>
                                        <DepDateTime>2014-08-08T06:10:00</DepDateTime>
                                    </Leg>
                                </Legs>
                                <Taxes>0</Taxes>
                                <FareADT>6500</FareADT>
                                <FareCHD>0</FareCHD>
                                <FareINF>0</FareINF>
                                <MiscFees>6400</MiscFees>
                                <Idx>307963</Idx>
                                <FareClass>Economy</FareClass>
                                <FareType>Web</FareType>
                                <FareId>3L0</FareId>
                            </Outbound>
                            <BagFee>0</BagFee>
                            <CcFee>600</CcFee>
                            <HandlingFee>500</HandlingFee>
                            <TotalFare>12900</TotalFare>
                            <FlightId>140514114543-02-21212-2</FlightId>
                            <Link2Book>http://sample.com</Link2Book>
                            <Provider>ElsyArres</Provider>
                        </Flight>
                        <Flight>
                            <Outbound>
                                <CarName>Inter Sky</CarName>
                                <CarCode>3L</CarCode>
                                <DepName>Friedrichshafen</DepName>
                                <DepCode>FDH</DepCode>
                                <DestName>Hamburg</DestName>
                                <DestCode>HAM</DestCode>
                                <Duration>01:45</Duration>
                                <FlightNo>3L376</FlightNo>
                                <DepDateTime>2014-08-08T18:00:00</DepDateTime>
                                <ArrDateTime>2014-08-08T19:45:00</ArrDateTime>
                                <Legs>
                                    <Leg>
                                        <Sequence>0</Sequence>
                                        <FlightNo>3L376</FlightNo>
                                        <DepCode>FDH</DepCode>
                                        <DepName>Friedrichshafen</DepName>
                                        <DestCode>HAM</DestCode>
                                        <DestName>Hamburg</DestName>
                                        <DepTime>18:00</DepTime>
                                        <ArrTime>19:45</ArrTime>
                                        <CarCode>3L</CarCode>
                                        <CarName>Inter Sky</CarName>
                                        <FareClass>Economy</FareClass>
                                        <ArrDateTime>2014-08-08T19:45:00</ArrDateTime>
                                        <DepDateTime>2014-08-08T18:00:00</DepDateTime>
                                    </Leg>
                                </Legs>
                                <Taxes>0</Taxes>
                                <FareADT>10500</FareADT>
                                <FareCHD>0</FareCHD>
                                <FareINF>0</FareINF>
                                <MiscFees>6400</MiscFees>
                                <Idx>307964</Idx>
                                <FareClass>Economy</FareClass>
                                <FareType>Web</FareType>
                                <FareId>3L0</FareId>
                            </Outbound>
                            <BagFee>0</BagFee>
                            <CcFee>600</CcFee>
                            <HandlingFee>500</HandlingFee>
                            <TotalFare>16900</TotalFare>
                            <FlightId>140514114543-02-21212-3</FlightId>
                            <Link2Book>http://sample.com</Link2Book>
                            <Provider>ElsyArres</Provider>
                        </Flight>
                    </Flights>
                </Response>
            </SoapMessage>
        </SearchFlightsResponse>
    </soap:Body>
</soap:Envelope>

암호

message.writeTo(System.out); //show message details

URL endpoint = new URL("http://testv80.elsyarres.net/service.asmx");
SOAPMessage response = connection.call(message, endpoint);

connection.close();

SOAPMessage sm = response;
System.err.println("sm is:" + sm);
System.out.println("Response:");
ByteArrayOutputStream out = new ByteArrayOutputStream();
sm.writeTo(out);

System.out.println(out.toString());  //ValidSoap message
NamespaceFilter outFilter = new NamespaceFilter(null, false);
Reader in = new StringReader(out.toString());  //reading character stream
InputSource is = new InputSource(in);
SAXSource source = new SAXSource(outFilter,is); 

202 행 >>>

this.results = (SearchFlightsResponse) JAXB.unmarshal(source, SearchFlightsResponse.class);
System.err.println(">" + results.getSoapMessage().getUsername());
JAXBContext context = JAXBContext.newInstance(SearchFlightsResponse.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(results, System.out);

이것이 제가 여기서 찾은 필터 구현입니다.

NamespaceFilter

public class NamespaceFilter extends XMLFilterImpl {

    private String usedNamespaceUri;
    private boolean addNamespace;

    //State variable
    private boolean addedNamespace = false;

    public NamespaceFilter(String namespaceUri,
            boolean addNamespace) {
        super();

        if (addNamespace)
            this.usedNamespaceUri = namespaceUri;
        else 
            this.usedNamespaceUri = "";
        this.addNamespace = addNamespace;
    }



    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        if (addNamespace) {
            startControlledPrefixMapping();
        }
    }



    @Override
    public void startElement(String arg0, String arg1, String arg2,
            Attributes arg3) throws SAXException {

        super.startElement(this.usedNamespaceUri, arg1, arg2, arg3);
    }

    @Override
    public void endElement(String arg0, String arg1, String arg2)
            throws SAXException {

        super.endElement(this.usedNamespaceUri, arg1, arg2);
    }

    @Override
    public void startPrefixMapping(String prefix, String url)
            throws SAXException {


        if (addNamespace) {
            this.startControlledPrefixMapping();
        } else {
            //Remove the namespace, i.e. don´t call startPrefixMapping for parent!
        }

    }

    private void startControlledPrefixMapping() throws SAXException {

        if (this.addNamespace && !this.addedNamespace) {
            //We should add namespace since it is set and has not yet been done.
            super.startPrefixMapping("", this.usedNamespaceUri);

            //Make sure we dont do it twice
            this.addedNamespace = true;
        }
    }

}

오류

java.lang.NullPointerException: No parent for filter
    at org.xml.sax.helpers.XMLFilterImpl.setupParse(XMLFilterImpl.java:714)
    at org.xml.sax.helpers.XMLFilterImpl.parse(XMLFilterImpl.java:356)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:203)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:181)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:232)
    at javax.xml.bind.JAXB.unmarshal(JAXB.java:259)
    at com.test.retrieveFlights(test.java:202)
at com.test.App.main(App.java:17)
Bdoughan

JAXB (JSR-222) 구현은 해당 SOAP 응답에 문제가 없어야합니다. 이 질문은 관련 질문에 대한 답변에 대한 답변 이었지만 그 답변이 잘못되었습니다.

SOAPMessage인스턴스는 SOAP 메시지의 DOM 표현입니다. 매핑 한 자식 요소로 이동하여 비 정렬 화하면됩니다. 다음은 관련 질문 중 하나에 대해 우리가 생각 해낸 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Magento 2 SOAP API에서 SOAP 응답을 역 직렬화 할 수 없음-응답의 XML 네임 스페이스와 서비스 참조 WSDL이 일치하지 않습니다.

분류에서Dev

Google Apps 스크립트를 사용하여 SOAP XML 응답을 구문 분석 할 수 없습니다.

분류에서Dev

네임 스페이스 'RouteComponentProps'를 형식으로 사용할 수 없습니다.

분류에서Dev

C #을 사용하여 xml 파일의 네임 스페이스에서 xr : uid 특성을 제거 할 수 없습니다.

분류에서Dev

제네릭을 사용하여 클래스를 인터페이스로 변환 할 수 없습니다.

분류에서Dev

PHPUnit이 Phalcon의 콜백 검사기를 찾을 수 없습니다 (네임 스페이스 문제).

분류에서Dev

네임 스페이스가 지정된 클래스 생성자에서 전역 네임 스페이스 함수를 사용할 수 없습니다.

분류에서Dev

단위 테스트를 참조한 후 네임 스페이스를 사용할 수 없습니다.

분류에서Dev

열거 형을 반복 할 때 네임 스페이스 함수를 제외하려면 어떻게합니까?

분류에서Dev

하나의 파일에 두 개의 네임 스페이스를 어떻게 사용할 수 있습니까?

분류에서Dev

변수를 사용하여 perl에서 특정 네임 스페이스를 설정할 수 있습니까?

분류에서Dev

응용 프로그램간에 .proto 파일의 네임 스페이스를 변경할 수 있습니까?

분류에서Dev

auto를 사용하여 네임 스페이스 범위에서 클래스 정적 상수를 정의 할 수 있습니까?

분류에서Dev

웹 사이트 프로젝트에서 네임 스페이스를 사용할 수 없습니다.

분류에서Dev

SOAP :: Lite를 사용하여 "method"요소에 네임 스페이스 정의

분류에서Dev

2 개의 네임 스페이스가있을 때 JAXB를 사용하여 2 개의 Java 객체에 대한 XML 응답을 어떻게 비 정렬화할 수 있습니까?

분류에서Dev

Helm / Kubernetes-StatefulSet : 다른 네임 스페이스의 serviceAccount를 사용할 수 있는지 여부

분류에서Dev

react-admin typescript : 네임 스페이스를 유형으로 사용할 수 없습니다.

분류에서Dev

PHP 네임 스페이스를 올바르게 사용할 수없는 것 같습니다.

분류에서Dev

Visual Studio C #에서는 Microsoft.AspNet.Identity 네임 스페이스를 사용할 수 없습니다.

분류에서Dev

컨트롤러에서 네임 스페이스를 사용할 수 없습니다.

분류에서Dev

XDocument를 사용하여 XML을 구문 분석하는 동안 네임 스페이스를 확인할 수 없습니다.

분류에서Dev

Roslyn의 네임 스페이스에 클래스를 효과적으로 추가 할 수 없습니다.

분류에서Dev

오류 : 현재 요소에 사용 된 접두사 ''의 네임 스페이스를 재정의 할 수 없습니다.

분류에서Dev

오류 : 현재 요소에 사용 된 접두사 ''의 네임 스페이스를 재정의 할 수 없습니다.

분류에서Dev

CreateAttribute ( "xmlns")를 사용하여 XmlDocument에 네임 스페이스를 추가 할 수 없음

분류에서Dev

어셈블리 정의는 외부 패키지의 네임 스페이스를 확인할 수 없습니다.

분류에서Dev

Repl의 : reload에서 함수 / 네임 스페이스를 제외 할 수 있습니까?

분류에서Dev

"네임 스페이스 사용"을 사용하여 네임 스페이스에서 변수를 어떻게 정의합니까?

Related 관련 기사

  1. 1

    Magento 2 SOAP API에서 SOAP 응답을 역 직렬화 할 수 없음-응답의 XML 네임 스페이스와 서비스 참조 WSDL이 일치하지 않습니다.

  2. 2

    Google Apps 스크립트를 사용하여 SOAP XML 응답을 구문 분석 할 수 없습니다.

  3. 3

    네임 스페이스 'RouteComponentProps'를 형식으로 사용할 수 없습니다.

  4. 4

    C #을 사용하여 xml 파일의 네임 스페이스에서 xr : uid 특성을 제거 할 수 없습니다.

  5. 5

    제네릭을 사용하여 클래스를 인터페이스로 변환 할 수 없습니다.

  6. 6

    PHPUnit이 Phalcon의 콜백 검사기를 찾을 수 없습니다 (네임 스페이스 문제).

  7. 7

    네임 스페이스가 지정된 클래스 생성자에서 전역 네임 스페이스 함수를 사용할 수 없습니다.

  8. 8

    단위 테스트를 참조한 후 네임 스페이스를 사용할 수 없습니다.

  9. 9

    열거 형을 반복 할 때 네임 스페이스 함수를 제외하려면 어떻게합니까?

  10. 10

    하나의 파일에 두 개의 네임 스페이스를 어떻게 사용할 수 있습니까?

  11. 11

    변수를 사용하여 perl에서 특정 네임 스페이스를 설정할 수 있습니까?

  12. 12

    응용 프로그램간에 .proto 파일의 네임 스페이스를 변경할 수 있습니까?

  13. 13

    auto를 사용하여 네임 스페이스 범위에서 클래스 정적 상수를 정의 할 수 있습니까?

  14. 14

    웹 사이트 프로젝트에서 네임 스페이스를 사용할 수 없습니다.

  15. 15

    SOAP :: Lite를 사용하여 "method"요소에 네임 스페이스 정의

  16. 16

    2 개의 네임 스페이스가있을 때 JAXB를 사용하여 2 개의 Java 객체에 대한 XML 응답을 어떻게 비 정렬화할 수 있습니까?

  17. 17

    Helm / Kubernetes-StatefulSet : 다른 네임 스페이스의 serviceAccount를 사용할 수 있는지 여부

  18. 18

    react-admin typescript : 네임 스페이스를 유형으로 사용할 수 없습니다.

  19. 19

    PHP 네임 스페이스를 올바르게 사용할 수없는 것 같습니다.

  20. 20

    Visual Studio C #에서는 Microsoft.AspNet.Identity 네임 스페이스를 사용할 수 없습니다.

  21. 21

    컨트롤러에서 네임 스페이스를 사용할 수 없습니다.

  22. 22

    XDocument를 사용하여 XML을 구문 분석하는 동안 네임 스페이스를 확인할 수 없습니다.

  23. 23

    Roslyn의 네임 스페이스에 클래스를 효과적으로 추가 할 수 없습니다.

  24. 24

    오류 : 현재 요소에 사용 된 접두사 ''의 네임 스페이스를 재정의 할 수 없습니다.

  25. 25

    오류 : 현재 요소에 사용 된 접두사 ''의 네임 스페이스를 재정의 할 수 없습니다.

  26. 26

    CreateAttribute ( "xmlns")를 사용하여 XmlDocument에 네임 스페이스를 추가 할 수 없음

  27. 27

    어셈블리 정의는 외부 패키지의 네임 스페이스를 확인할 수 없습니다.

  28. 28

    Repl의 : reload에서 함수 / 네임 스페이스를 제외 할 수 있습니까?

  29. 29

    "네임 스페이스 사용"을 사용하여 네임 스페이스에서 변수를 어떻게 정의합니까?

뜨겁다태그

보관