2011-04-07 2 views
1

여러분 모두 도와 주셔서 미리 감사드립니다. 나는 나에게 다음과 같은 방법으로 SOAP 메시지 반환하는 웹 서비스 소모하고있어 : NSXMLParser 오류, XML 태그 내에 유효하지 않은 문자를 제거하는 방법은 무엇입니까?

상황이다

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soapenv:Body> 
    <getMessagesResponse xmlns="urn:DefaultNamespace"> 
    <getMessagesReturn xmlns=""> 
    &lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot; ?&gt; 
&lt;contact&gt; 
A message with escaped values like &amp; &lt; &gt; 
&lt;/contact&gt; 
</getMessagesReturn> 
    </getMessagesResponse> 
</soapenv:Body> 
</soapenv:Envelope> 

내가 NSUTF8StringEncoding이 getMessagesReturn 아이를 읽기 위해 사용하고 다음과 같은 저를 생성

<?xml version="1.0" encoding="ISO-8859-1"> 
     <contact> 
     A message with escaped values like & < > 
     </contact>; 

내 문제는 또한 접촉 태그 내부의 & <>를 언 이스케이프이다, 이러한 잘못된 문자가 내부에 있기 때문에 물론 NSXMLParser에서 오류가 발생합니다 XML 태그.

내 질문은 어떻게 피할 수 있습니까? 정보를 파서에 전달하기 전에 태그 메시지 내용 만 이스케이프 (escape) 할 수있는 방법이 있습니까?

도움을 주시면 감사하겠습니다.

편집 내가 사용

[NSString stringWithCString:(char*)elementText encoding:NSUTF8StringEncoding]; 
+0

데이터를 UTF8로 변환하기 위해 사용하고있는 것이 무엇인지 모르겠지만 NS-apis가 엔티티를 벗어나지 않습니다. –

답변

1

당신이 웹 서비스를 제어하는? getMessageReturn을 전달하는 올바른 방법은 CDATA를 사용하는 것입니다. 그렇지 않으면, 올바른 인코딩이 같은 것 (메시지 자체에주의 추가 & A의)

<getMessagesReturn xmlns=""> 
    &lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot; ?&gt; 
&lt;contact&gt; 
A message with escaped values like &amp;amp; &amp;lt; &amp;gt; 
&lt;/contact&gt; 
</getMessagesReturn> 

그러나 CDATA 훨씬 쉽게이며,이 그것을 위해 무엇이다. 그 밖의 것이 없다면 파싱하기 전에 문자열 대체를 사용하여 CDATA를 삽입 할 수 있습니다.

+0

답변 Rob에게 감사드립니다.하지만 getMessageReturn의 내용이 전체 XML, 어쨌든 그것을 구문 분석하거나 CDATA 문자열 내부 정보를 찾을 수있는 몇 가지 코드를 작성해야합니다. 아마도 웹 서비스 공급자와 이야기하고 CDATA 블록 안에있는 모든 태그 내용을 캡슐화 할 수 있는지 확인하면 XML을 올바르게 읽고 모든 태그 안의 데이터를 foundCData 메서드로 캡처 할 수 있습니다. NSXML 파서가 맞습니까? –

+0

XML 내부에 XML을 내장하는 경우 CDATA를 사용해야합니다. 모든 태그 내용을 CDATA로 만들 필요는 없습니다. 이 특정 태그에 대해 foundCData를 사용합니다. 결과는 처음부터 다시 시작해야하는 문자열입니다 (완전히 다른 문서이기 때문에). BTW는 CDATA를 수동으로 주입하기 위해 NSScanner를 사용하여 문자열의 올바른 위치를 찾은 다음 삽입합니다. 그래도 원본 XML을 수정하는 것이 좋습니다. 그것은 유효하지 않습니다. –

+0

감사합니다. Rob, WSOP 공급자에게 CDATA 블록 안에 모든 태그 내용을 캡슐화하고 NSXMLParserDelegate의 foundCDATA를 사용하여 정보를 얻도록 요청하는 해결책을 찾았습니다. –

관련 문제