문제

나는 빠르고 더러운 구성을 편집기를 실행됩니다.흐름용은 다음과 같습니다.

구성(포코스 서버에서)직렬화를 XML.
XML 가 잘 형성되어 있습니다.구성은 웹 서버로 전송에 XElements.
웹 서버는 XML(예,그것의 모든)가 버려진 textarea 편집할 수 있습니다.
사용자가 편집한 XML 을 직접 웹 페이지에서 클릭하여 제출합니다.
응답에,나는 검색을 변경 텍스트는 XML 의 구성이 있습니다.이 시점에서,모든 탈출되었으로 되돌에 의해 표시하는 프로세스에서 그들을 웹 페이지입니다.
을 로드하는 문자열로 XML 체(XmlElement,하려면,다음,어떤).KABOOM.

문제는 직렬화를 탈출 특성 문자열이지만,이것을 잃는 것입니다.

예를 들어,말하자 나는 목표가 있는 regex.여기에 구성 제공으로 웹 서버:

<Configuration>
  <Validator Expression="[^&lt;]" />
</Configuration>

그래서,저는 이것을 텍스트 영역,어디 그것은 다음과 같이 사용:

<Configuration>
  <Validator Expression="[^<]" />
</Configuration>

그래서 사용자에게 약간 수정하고 제출하고 변경이다.웹 서버의 응답에는 문자열은 다음과 같:

<Configuration>
  <Validator Expression="[^<]" />
  <Validator Expression="[^&]" />
</Configuration>

그래서,사용자가 검증효과에 기초하여,그리고 지금은 모두 특성으로 잘못된 문자가 있습니다.하려고하면 이 모든 XML 체,그것은 예외가 발생하기 때문에 < 고&유효하지 않은 텍스트 문자열입니다.할 수 없습할 수 없는 사용할 수 없습니다 어떤 종류의 인코딩 기능 인코딩 전체 피 묻은 것:

var result=서버입니다.HttpEncode(editedConfig);

결과

&lt;Configuration&gt;
  &lt;Validator Expression="[^&lt;]" /&gt;
  &lt;Validator Expression="[^&amp;]" /&gt;
&lt;/Configuration&gt;

이 유효하지 않은 XML.는 경우에도 이를 XML 요소는 모든 종류의 수중에 떨어지는 모 루.내가 좋아하지 않는 떨어지는 anvil.

그래서 질문은...만을 수 있는 방법 이 문자열에는 XML 준비를 위한 분석으로 XML 오브젝트를 사용하여 regex 대?하는 방법은 없"turn off 제약 조건을 때"나는 컴퓨터가 더 빨리 만들 수 있습니다.당신은 어떻게 이것을 이용할 수 있을까요???


마지막 응답한 다음 wiki-izing 이지가 있다고 생각하지 않은 유효한 대답합니다.

XML 나는 장소에서 텍스트 영역이 유효한을 탈출 XML.프로세스의 1)에 넣어 텍스트 영역 2)에서 클라이언트로 보내 3)표시되는 클라이언트에 4)상담요청을 보내는데 그것은에서 5)그것을 다시 보내 서버 6)값을 검색하 양식에서 제거하는 모든 완벽한 조화를 이루고 있습니다.

자 이 말을 다시:나 un-escaping 니다.단지 그것을 표시하는 브라우저에서는 이!

는 것을 궁리:이 있을 방지하는 방법이 유엔에서 탈출에서 일어나는 첫 번째 장소는?방법은 없을 거의 유효한 XML,"깨끗한"안전한 방식으로 그것?


이 질문에 지금은 은혜에 있습니다.하는 현상금을 수집,당신을 보여 편집하는 방법은 유효한 XML 브라우저 창에서 없이 제 3 자에 오픈 소스 소프트웨어 도구는 필요하지 않 사용하는 regex 을 탈출 특성 값을 수동으로,필요로하지 않는 사용자가 탈출 그들의 특성,그리고 실패하지 않는 경우 라운드 트립(&amp;amp;amp;etc.;)

도움이 되었습니까?

해결책

Erm... 는 방법 당신은 당신 serialize?일반적으로,XML serializer 않을 생산하는 잘못된 XML.

/편집에 응하여 업데이트:마 표시 잘못된 XML 귀하의 사용자가 편집!대신,디스플레이 제대로 탈출 XML 에 TextBox.고장을 수리 XML 지 않는 재미 있고 실제로 볼 수 없는 이유를 표시하지 않도/편집 XML 에서 유효한 한 형태이다.

내가 다시 물을 수 있다: 는 방법 당신은 표시에서 XML 을 입력란?당신은 것을 의도적으로 unescape XML 에서 일부 지점입니다.

/편집에 응하여 최신 논평:음 예,명백하게 때문에,그것은 포함될 수 있습니다.당신은 탈출하는 데 필요 XML 기 전에 제대로 쓰기로 그것은 HTML 페이지입니다.는 나는 의미 전체 XML.그래서 이것:

<foo mean-attribute="&lt;">

다음이 됩니다.

&lt;foo mean-attribute="&amp;&lt;"&gt;

다른 팁

물론 당신은 엔터티를 넣어 참조 내부에 텍스트 영역에서 온 이스케이프.텍스트 영역 마법,당신은 탈출;모든 것을 당신은 그들에 넣어 처럼 다른 모든 요소입니다.브라우저 표시 raw'<'에서 텍스트 영역만 있지만,때문에 그들을 정리하려고 하니다.

그래서 만약 당신이 넣고 편집할 수 있는 XML 에서 텍스트 영역,당신은 탈출하는 데 필요 특성 값은 한 번에게 유효한 XML,그리고 당신은 탈출해야 전체 XML 시 유효한 HTML.최종 소스에 표시할 페이지의 것:

<textarea name="somexml">
    &lt;Configuration&gt;
        &lt;Validator Expression="[^&amp;lt;]" /&gt;
        &lt;Validator Expression="[^&amp;amp;]" /&gt;
    &lt;/Configuration&gt;
</textarea>

질문을 기반으로 오해의 콘텐츠 모델의 텍스트 요소는 검사기를 고른 것이 문제다.

ETA 재 논평:만,무엇이 문제는 남아 있습니까?는 문제에 바코드 표시 side.남아있는 모든 분석은 그것에 다시,고 있는지에 대한 가정을 만들 수있는 사용자가 잘 형성되는 XML.

구문 분석하려고 하는 비 잘 형성되는 XML,할 수 있도록하기 위해 다음과 같은 오류가 있'<'또는'&'이스케이프 처리되지 않은 상태에서 속성 값은,손실에 대하여 완전히는 방법 XML 되어 작동합니다.할 수 없는 경우 신뢰하는 사용자를 쓰는 잘 형성되는 XML,그들에게 쉽게 비 XML 인터페이스와 같이 단순 줄바꿈으로 구분한 목록으로는 정규 표현식 문자열입니다.

당신 말대로,정상적인 serializer 탈출해야에 대한 모든 것을.

그렇다면,문제는 텍스트를 블록당신이 필요 아무것도 처리를 통해 전달 textblock 다.

당신이 볼 수도 있습 HttpUtility.HtmlEncode(),그러나 내가 생각하는 가장 간단한 방법은 아무것도 넣을 통과 텍스트를 블록 CDATA 섹션입니다.

일반적으로 물론 내가 원하는 모든 것이 제대로 탈출에 의존하기보다 CDATA"신"하지만,나는 또한 원하는 것이 사용하는 내장 할 수있는 도구를 탈출.를 위해 뭔가 편집에서 그것은"최대 절전 모드 상태를"사용자에 의해,내 생각 CDATA 방법이 될 수도 있습니다.

또한 이 이전 질문:
최선의 방법은 인코딩하는 텍스트 데이터에 대한 XML


업데이트
에 기반 코멘트를 다른 응답,내가 깨달은 당신을 보여주는 사용자 태그,단지 내용입니다.Xml 파서는 아니라,까다롭다고 밝혀졌습니다.내가 생각하는 당신이 할 수있는 가장 좋은 것은 이 사건을 확인하는 것입을 위해 올바른 형식 을 받아들이 편집 xml.

아마도 하려고 자동으로 올바른 특정한 종류의 오류(나쁜 앰퍼샌드 내에서는 연결된 질문)지만,다음의 번호를 열 번호의 첫 번째 유효성 검사 오류가에서.Net 은 xml 파서 사용하는 사용자를 보여주는 자신의 실수를 때까지 그들은 당신이 뭔가를 수락가능합니다.보너스 포인트는 경우에 당신은 또한에 대해 유효성을 검사합니다.

당신이 걸릴 수 있습에 TinyMCE, 할 수 있는 html 편집에서 풍부한 텍스트 상자입니다.할 수 없는 경우도록 구성을 정확히 무엇을 원한다면,당신은 그것을 사용할 수 있으로 영감을 준다.

참고:파이어 폭스(내에서 테스트)하지 않습 unescape 에서 텍스트 영역으로 대해 설명합니다.특히,이 코드:

<textarea cols="80" rows="10" id="1"></textarea>

<script>
elem = document.getElementById("1");

elem.value = '\
<Configuration>\n\
  <Validator Expression="[^&lt;]" />\n\
</Configuration>\
'
alert(elem.value);
</script>

는 경고하고 사용자에게 표시 변경, 로:

<Configuration>
  <Validator Expression="[^&lt;]" />
</Configuration>

그래서 어쩌면 하나(un-실행 가능한?) 솔루션은 귀하의 사용자가 사용하세요.


것 두 부속 질문이 공개되었:

1 XML 는 표시이 이스케이프.

예를 들어,"&lt; 는"이스케이프라"<".하지만 이후"<"또한 이스케이프라"<"정보가 분실과할 수 없습니다.

하나의 솔루션을 위해 당신은 탈출하는 모든"&"문자,그래서"&lt;"가"&amp;lt;".이 것이 그런 다음 이스케이프에 의하여 텍스트 영역으로"&lt;".당신이 그것을 읽을 때,그것은 것으로 첫 번째 장소입니다.(나 추측하고 있는 텍스트 영역이 실제로 변경 내용 문자열을,하지만 파이어 폭스 행동하지 않을로 당신을 보고 그래서 확인할 수 없습니다 이)

다른 솔루션(언급된 이미 생각하는)빌드/구매/빌려 주문 텍스트 영역(나쁘지 않다면 간단하지만,거기에 모두 편집 키,ctrl-C,ctrl-shift-왼쪽에).

2 당신 같은 사용자가를 귀찮게 하지 않아야 합니다.

당신은 탈출-지옥:

Regex 을 대체하는 것이 대부분이다.지할 수 있는 방법 안정적으로 검 따옴표(")를,사용자 수(합법적으로,약관 내에서 당신은 주어진)입력:

<Configuration>
  <Validator Expression="[^"<]" />
</Configuration>

그것을 보는 관점에서 정규식의 구문,그것은 또한 말할 수 없는지 여부를 최종의 일부입니다"정규식,또는 그것의 끝.Regex 구문에 일반적으로 이러한 문제를 해결이 명시적으로 터미네이터 예를 들어:

/[^"<]/

는 경우 사용자가 사용하는 이 구문(와 터미네이터),그리고 당신이 쓴 파서 그것을 위해,당신은 이해할 수 있는 regex 종료되었다,따라서는 다음"특성의 일부가 아닙니다 regex 하지만,일부 의 XML,따라서 어느 부분이 필요하다 탈출했다.내가 말하는 게 아니에요 당신이해야 한다!나는 그것을 말하의 이론적으로 가능합니다.그것은 꽤 멀리에서 빠르고 더럽습니다.

BTW:동일 문제가 발생한 텍스트 요소 내에서.다음과 같은 합법적인 이내에,이 약관을 준,하지만 같은 문제 분석:

<Configuration>
  <Expression></Expression></Expression>
</Configuration>

기본적인 규칙에서 구할 수 있는"어떤 텍스트는"구분 이스케이프,(예:"또는 <다),그래서는 인식 할 수있다.대부분의 구문도 탈출을 무리의 다른 물건을 위해,편리/습니다.(편집 그것을 가지고 있어야합니다 탈출해 나 탈출문자 자체:에 대한 XML,그것은"&"는 리터럴 때는 이스케이프"&amp;"에 대한 정규 표현식,그것은 C/unix-style"\"는 리터럴 때는 이스케이프"\\").

둥지를 구문,당신은 탈출-지옥입니다.

하나의 간단한 솔루션을 위해 당신에게 사용자가:이 빠르 편집기를 구성,그래서 당신이 어떤 멋진"아무 탈출해야"mamby-pamby:

  • 목록자와 탈출을 다음 텍스트 영역,예를 들어:"<"로 "&lt".
  • XML 지 않을 것이다 검사,표시 그들에게 목록을 표시됩니다.

다시 찾고,내가 참조 bobince 게 동일한 기본적인 대답이다.

삽입 CDATA 주위의 모든 텍스트의 다양한 선택을 할 수 있습니다 탈출하는 메커니즘은(1)저장 사용자가 수동으로 탈출,그리고(2)사용된 텍스트를 자동으로는 이스케이프 처리되지 않은 상태에 의해 텍스트 영역을 다시 읽습니다.

 <Configuration>
   <Validator Expression="<![CDATA[  [^<]   ]]>" />
 </Configuration>

:-)

이 특별한 문자"<"-이 있어야 교 다른 문자와 그래서는 XML 유효합니다.이 링크를 확인에 대한 XML 특수 문자:

http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

려고 또한 인코딩하기 위 TextBlock 콘텐츠를 전송하기 전에 deserializer:

HttpServerUtility utility = new HttpServerUtility();
string encodedText = utility.HtmlEncode(text);

이것은 정말 나의 옵션만?이지 충분히 일반적인 문제는 이 솔루션은 어딘가에 framework?

private string EscapeAttributes(string configuration)
{
    var lt = @"(?<=\w+\s*=\s*""[^""]*)<(?=[^""]*"")";
    configuration = Regex.Replace(configuration, lt, "&lt;");

    return configuration;
}

(편집:삭제 앰퍼샌드 보충으로 그것이 문제를 일으키는 라운드 트립)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top