development

XML 속성에 줄 바꿈을 저장하는 방법은 무엇입니까?

big-blog 2020. 12. 29. 08:19
반응형

XML 속성에 줄 바꿈을 저장하는 방법은 무엇입니까?


텍스트가 아닌 일부 XML 속성에 줄 바꿈이 포함 된 콘텐츠를 저장해야합니다. XSLT 1.0 / ESXLT / XSLT 2.0에서 디코딩 할 수 있도록 메서드를 선택해야합니다.

가장 좋은 인코딩 방법은 무엇입니까?

몇 가지 아이디어를 제안 / 제공하십시오.


호환되는 DOM API에서는 수행 할 작업이 없습니다. 실제 개행 문자를 속성에 저장하기 만하면 API 가이를 자체적으로 올바르게 인코딩합니다 ( 표준 XML 사양, 섹션 5.2 참조 ).

당신이 당신의 자신의 인코딩 (예를 교체 할 경우 \n
속성 값을 저장하기 전에), API는 사용자의 입력을 인코딩합니다 다시 결과 
XML 파일입니다.

결론은 문자열 값이 그대로 저장된다는 것입니다. 당신은 당신이 넣은 것을 꺼내고 간섭 할 필요가 없습니다.

그러나 … 일부 구현은 규정을 준수하지 않습니다. 예를 들어, &속성 값으로 문자를 인코딩 하지만 개행 문자 나 탭은 잊어 버립니다. 이것은 단순히 줄 바꿈을 
미리 바꿀 수 없기 때문에 잃어버린 위치에 있습니다 .

이러한 구현은 다음과 같이 인코딩되지 않은 개행 문자를 저장합니다.

<xml attribute="line 1
line 2" />

이러한 문서를 구문 분석 할 때 속성의 문자 개행 문자는 단일 공백으로 정규화되어 (다시 한 번 사양에 따라) 손실됩니다.

이러한 구현에서는 속성에 줄 바꿈을 저장 (및 유지!)하는 것이 불가능합니다.


엔티티 &#10;사용하여 XML 속성에서 개행을 나타낼 수 있습니다 . &#13;캐리지 리턴을 나타내는 데 사용할 수 있습니다. Windows 스타일 CRLF는 &#13;&#10;.

이것은 합법적 인 XML 구문입니다. 자세한 내용은 XML 사양 을 참조하세요.


대략적인 대답은 다음과 같습니다.

XmlDocument xDoc = new XmlDocument();
xDoc.Load(@"Agenda.xml");
//make stuff with the xml
//make attributes value = "\r\n" (you need both expressions to make a new line)
string a = xDoc.InnerXml.Replace("&#xD;", "\r").Replace("&#xA;", "\n").Replace("><",">\r    \n<");
StreamWriter sDoc = new StreamWriter(@"Agenda.xml");
sDoc.Write(a);
sDoc.Flush();
sDoc.Dispose();

보시다시피 이것은 문자열입니다.


일부 상황에서 도움이 된 약간 다른 접근 방식

자리 표시 자 및 찾기 및 바꾸기.

구문 분석하기 전에 사용자 정의 줄 바꿈 마커 / 자리 표시자를 사용하면됩니다. 그런 다음 상황의 후반부에서 문자열을 \ n 또는 또는 # & 10; 또는 \ u2028 또는 다양한 줄 바꿈 문자가 있습니다. 처음에 데이터에서 자신의 자리 표시자를 설정 한 후 다시 찾아서 바꿉니다.

이것은 jQuery $ .parseXML ()과 같은 파서가 인코딩되지 않은 줄 바꿈을 제거 할 때 유용합니다. 예를 들어 {LBREAK}를 줄 바꿈 문자로 사용하고 원시 텍스트 동안 삽입하고 나중에 XML 객체로 구문 분석 한 후 대체 할 수 있습니다. String.replaceAll ()은 유용한 프로토 타입입니다.

따라서 jquery 및 replaceAll 프로토 타입을 사용한 대략적인 코드 개념 (이 코드를 테스트하지는 않았지만 개념을 보여줍니다) :

function onXMLHandleLineBreaks(_result){
    var lineBreakCharacterThatGetsLost = '&#10;';
    var lineBreakCharacterThatGetsLost = '&#xD;';
    var rawXMLText = _result; // hold as text only until line breaks are ready
        rawXMLText = String(rawXMLText).replaceAll(lineBreakCharacterThatGetsLost, '{mylinebreakmarker}'); // placemark the linebreaks with a regex find and replace proto
    var xmlObj = $.parseXML(rawXML); // to xml obj
    $(xmlObj).html( String(xmlObj.html()).replaceAll('{mylinebreakmarker}'), lineBreakCharacterThatWorks ); // add back in line breaks
    console.log('xml with linebreaks that work: ' + xmlObj);
}

물론 데이터 상황에 맞게 작동하거나 작동하지 않는 줄 바꿈 문자를 조정할 수 있으며 작동하지 않는 줄 바꿈 문자 집합에 대한 루프에 넣고 반복하여 작업을 수행 할 수 있습니다. 전체 줄 바꿈 문자 집합.

참조 URL : https://stackoverflow.com/questions/2004386/how-to-save-newlines-in-xml-attribute

반응형