2012-07-27 3 views
0

이스케이프 처리되지 않은 일부 콘텐츠가 포함 된 'xml'문자열이 표시됩니다. 여기에 간단한 예제입니다 : 당신이 XmlDocument.LoadXml()를 사용하여 문자열로 위를 변환 할 때원시 문자열에서 xml 콘텐츠를 이스케이프 처리하는 방법은 무엇입니까?

<link text="This is some text with "potentially" some quoted text in it." linktype="external" anchor="" target="" /> 

내가 가진 문제는, LoadXml() 때문에 보유 내용에 대한 내부 따옴표에 이스케이프의 부족 예외가 발생합니다 속성 'text'. 상대적으로 고통없이 콘텐츠를 구체적으로 벗어나는 방법이 있습니까? 아니면 그냥 구문 분석/탈출/직접 작성해야할까요? 나는이 텍스트를 생성하고 있지 않다

, 난 그냥이 같은 문자열에 다른 프로세스에서 그것을 얻을 :

"<link text="This is some text with "potentially" some quoted text in it." linktype="external" anchor="" target="" />" 
+0

먼저 XML을 생성하여 _compliant_ XML을 생성하는 방법에 대해 살펴 보겠습니다. 이것은 당신이 처리해야하는 것이 아닙니다. –

답변

1

당신은 "&quot;

을 여기서 html로 문자 인코딩을 사용해야하지만, 귀하의 의견은 당신이 그 텍스트를 구문 분석과 인코딩 번역 따옴표를 대체 할 수있는 방법을 찾아야 잘못된 XML 텍스트이기 때문이다. 어쩌면 일부 정규식 파싱을 할 수 있습니다.

작업을 만드는 데 창의적인 방법을 고려해보십시오. 나는 그것이 더러운 알고 있지만, 대부분의 경우에 작동합니다

private static string XmlEncodeQuotes(string target) { 

     string result = string.Empty; 
     for (int i = 0; i < target.Length; i++) 
     { 
      if (target[i] == '"') 
      { 
       if (target[i - 1] != '=') 
        if (!Regex.IsMatch(target.Substring(i), @"^""\s[a-zA-Z]+=""")) 
        { 
         result += "&quot;"; 
         continue; 
        } 
      } 
      result += target[i]; 
     } 
     return result; 
    } 
+0

그래, .NET에 내장 된 덜 고통스러운 방법이 있기를 기대하고있다. 정규식을 작성하기 시작하기 전에 이미 ... –

+0

실제로 나는 그것이 불가능하다고 생각한다. 정규식 당신은 당신이 많은 눈먼 짐작이 필요하다는 것을 알게 될 것입니다. –

+0

이것은 제가 실제로 필요한 것에 가깝고, 단지 공백 속성의 끝 인용문과 일치하는 정규식을 다루기 위해 부차적 인 조정을해야했습니다 ('id = ""' '). –

0

당신은 CDATA 태그 내에서 XML 문서의 일부를 감싸는 시도?

+0

나는 위의 문자열을 생성하는 프로세스를 변경할 수 없으므로 내용을 생성하지 않습니다. 나는 문자 그대로 위의 내용을 문자열로 얻고 있습니다. –

0

윌 System.Security.SecurityElement.Escape()는 당신을 위해 일? 그렇지 않으면 XmlTextWriter도 있습니다. 당신은 단순히 어떻게 견적을 탈출하는 요구가있는 경우

+0

나는 downvoting 아니지만 아니에요! 이거 작동 안 할거야!그것은 단지 "무효"문자를 번역 할 것입니다. –

+0

OK, 다시 읽었을 때받은 값을 다른 XML 파일에 쓰려고 생각 했었습니다.하지만 파싱을 시도하고 유효하지 않은 경우에는 직접 파싱하거나 데이터 공급자가 적절하게 이스케이프 처리 된 XML 스 니펫을 보내려면 어떤 종류의 스 니펫을 보내야하는지에 따라 제한됩니다 (예 : 항상이 "링크"스타일 인 경우). 자체 파싱은 쉽습니다. 충분히). –

0

, 즉는 당신이 무엇을 다루고 있는지 확실하지 않다

&quot; 

으로 수행하지만, 문제의 뿌리는 데이터가 사실이다있어 당신은 수신이 잘못되었습니다.

  • 옵션 1) 데이터를 정리하지 않는 한, 당신이 잘못된 XML 데이터를로드하는 힘든 시간을 가장 파서을 받고있을 것이다. 어떤 사람들은 다른 사람들보다 용서를 더 많이합니다. 당신은 구문 분석 솔루션을 코딩 옵션을 사용 XSLT없는 경우 HTML Agility Pack

  • 옵션 2) Use Regular Expressions to fix your XML.

  • 옵션 3)과 약간의 행운이있을 수 있습니다. 간단히 transform을 만든 다음 템플릿을 추가하여 문제를 해결하십시오.

관련 문제