2009-09-09 3 views
1

현재 XmlDocument에 XHTML을 작성하고 있습니다. 이것은 완벽하게 작동하지만 한 가지 문제에 봉착했습니다. 일부 XmlText 요소에는 & nbsp; 같은 것을 포함 할 수 있습니다. 그런 일을 스트림에 쓰고 싶을 때, 그러한 노드의 innerText 값 대신에 innerXML을 사용합니다. 문제는 출력이 & amp; nbsp; & nbsp; 대신. 스트림에 쓸 때 이러한 이스케이프를 수행하지 않고 xmlwriter 및 xmldocument를 어떻게 사용할 수 있습니까? 나는 이스케이프 처리되지 않은 결과 만 원한다.C#에서 이스케이프 처리되지 않은 XMLDocument 작성

+0

호기심입니다. Isnt XHTML, XML 형식? 텍스트 파일 그대로 쓰는 것이 쉽지 않을까요? – shahkalpesh

답변

2

XmlWriter.WriteRaw을 사용하면 원시 XML이 있다고 가정하여 이스케이프를 수행하지 않습니다.

예를 들어

:

using System; 
using System.Xml; 

class Test 
{ 
    static void Main() 
    { 
     using (XmlWriter writer = XmlWriter.Create(Console.Out)) 
     { 
      writer.WriteStartDocument(); 
      writer.WriteStartElement("root"); 
      writer.WriteRaw("<element>&nbsp;</element>"); 
      writer.WriteEndElement(); 
      writer.WriteEndDocument(); 
     } 
    } 
} 

출력 : 당신은 .NET 3.x를을 사용하는

<?xml version="1.0" encoding="IBM437"?><root><element>&nbsp;</element></root> 
+1

XmlDocument.Save 루틴에서도 가능합니까? DOM 트리는 그 트리를 생성하는 인터프리터에서 나오므로 DOM 트리를 직접 걷고 싶지는 않습니다. –

1

가정 학습과 LINQ는 - 투 - XML ​​... API가 매우 간단 사용 더 유능한. 그렇게하면 DOM을 걷거나 트래버스 할 필요가 없다. 대신에 오브젝트 트리를 질의 할 수있다.

특히 API의 XDocument 클래스를 살펴보십시오.

2

여기에서 잘못된 문제를 거의 해결하려고합니다. 줄 바꿈하지 않는 텍스트가 필요한 경우 non-breaking space character을 사용해야합니다. 문자는 C# 문자열에서 당신은 예를 들어, 이스케이프 시퀀스 \u00A0로 작성할 수 있습니다 nbsp 같은

 var xmldoc = new XmlDocument(); 
    XmlElement test = xmldoc.CreateElement("test"); 
    xmldoc.AppendChild(test); 
    XmlText nbsp = xmldoc.CreateTextNode("\u00A0"); 
    test.AppendChild(nbsp); 

HTML 엔티티가 아닌 유니 코드 텍스트 파일에 같은 문자를 인코딩하는 단지 방법입니다. XML DOM을 만들 때 이들을 사용하면 안됩니다. 그런데, .NET이 위의 DOM을 ASCII 인코딩 된 파일 (적절한 XmlWriterSettings를 통해)로 작성하도록 강제하면, 깨지지 않는 공백 문자를 &#xA0;으로 작성합니다. UTF-8로 인코딩 된 파일 (기본값)은 단지 공백으로 나타납니다.

특정 리터럴 문자 시퀀스가 ​​XML 출력에 나타나게하면 XML 프로세서를 준수하여로드 할 수없는 잘못된 XML이 작성 될 위험이 있습니다. 예를 들어 <test> & nbsp를로드하려고합니다. 이 비어 있습니다. XmlDocument. 이것은 예외를 던질 것이다. 공정하게하려면 과 같은 엔티티를 선언 할 수 있으며 XHTML 스키마는 그렇게합니다. 그러나 당신이 나의 요지를 보길 바랍니다.

편집 : XmlDocument가 올바르게 작동하고 있습니다. & <과 같은 문자를 이스케이프하지 않으면 다시로드 할 수없는 잘못된 XML이 생성 될 수 있습니다. 출력에서 XML 엔티티를 강제 실행하려면 XmlDocument.CreateEntityReference을 사용해야합니다. 이 버그는 XmlEntityReference 노드를 생성하는 대신 XmlText 노드의 엔티티를 사용하는 코드에서 발생합니다.

+0

이 솔루션은 저에게 적합하지 않다고 생각합니다. 구문 분석기에서 입력 한 형식을 사용하도록 입력을 강제 할 수 없습니다. 나는 또한 작가와 함께 당신의 솔루션을 try'd,하지만 그 작동하지 않습니다. 문제는 작가 자체가 아니라 이미이 작업을 수행하는 XmlDocument라고 생각합니다.문서의 innerXml의 내용을 살펴볼 때 이미 이스케이프 처리가 수행됩니다. 나는 또한 XHTML 태그가 필요하기 때문에 innerText를 사용할 수 없다. non-breaking space는 모든 유형의 HTML 인코딩에 문제가 나타나기 때문에 문제의 예일뿐입니다. –

+0

@ Captain007 어떤 파서를 사용하고 있습니까? – Alohci

+0

도메인 특정 언어 용 수작업 파서. 도메인 특정 언어에서는 이스케이프 된 문자와 이스케이프되지 않은 문자를 함께 사용할 수 있습니다. –

관련 문제