2011-04-10 6 views
5

저는 XElement 객체를 사용하여 ASP.NET 페이지의 코드 숨김에 HTML을 구현하고 있습니다.HTML 내용을 이스케이프하는 System.Xml.Linq.XElement를 피하는 방법?

I 수도 있고 나는 다음과 같은 방식으로, 진행하면서이 XElement를 일부 XAttributes를 추가 할 수 없습니다 : 나는 에 HTML을 포함 myDiv 일부 콘텐츠를 추가 할 경우, 지금

var elmnt = new XElement("div", 
    new XAttribute("id", "myDiv"), 
    ); 

의 내 상황에 XElement가 자동으로 이스케이프 처리하여 바람직하지 않습니다.

내가 가진 그래서 경우 :

var elmnt = new XElement("div", 
    new XAttribute("id", "myDiv"), 
    "<span id='content'>hello world</span>" 
    ); 

그리고 나는 다음과 같은 코드를 사용하여 자리 표시 자 객체로이 렌더링 : 페이지가로드, 소스 안에 그 내부 내용을 알 때

myPlaceholder.Controls.Add(new System.Web.UI.WebControls.Literal { Text = elmnt.CreateNavigator().OuterXml }); 

elmnt은 이스케이프 처리되었으며 페이지 소스에 다음 형식을 사용합니다.

여기서 컴파일하는 XML이 유효한 HTML이고 내부 내용이 유효한 HTML이기 때문에 XElement 부모 개체에 이 아닌 것으로 말할 수 있습니까? 내부 콘텐츠를 이스케이프 처리합니까? 어떻게 네이티브 포맷으로 남겨 둘 수 있습니까? 당신이 그것에 추가 할 때 다음 XML과 HTML을 치료하는 경우

답변

7
var elmnt = new XElement("div", 
    new XAttribute("id", "myDiv"), 
    new XRaw("<span id='content'>hello world</span>") 
); 


public class XRaw : XText 
{ 
    public XRaw(string text):base(text){} 
    public XRaw(XText text): base(text){} 

    public override void WriteTo(System.Xml.XmlWriter writer) 
    { 
    writer.WriteRaw(this.Value); 
    } 
} 
-1

왜 당신은 따라서 새로운 XMLELEMENT을 만들 것 XML을

을 추가해야

StringWriter stringWriter = new StringWriter(); 

HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter); 
htmlWriter.RenderBeginTag(HtmlTextWriterTag.Span); 
htmlWriter.AddAttribute(HtmlTextWriterAttribute.Id, "content"); 
htmlWriter.Write("hello world"); 
htmlWriter.RenderEndTag(); 

htmlWriter.Flush(); 

stringWriter.ToString(); //<span id='content'>hello world</span> 
+0

지정된 HtmlTextWriter 클래스는, MustInherit' '로 표시됩니다. 큰 질문이지만, 위 예제를 사용하여 HtmlTextWriter 객체로 변환하는 간단한 예제를 제공 할 수 있습니까? – awj

+0

XElements를 받아들이는 맞춤식 캐시를 사용하고 있기 때문에 XElement 클래스를 사용하고 싶지만 HtmlTextWriter의 인스턴스를 받아 들일지 확실하지 않습니다. 또한 내부 HTML을 단순히 포함하기 위해 이것을 사용하지 않고 전체 XElement를 HtmlTextWriter로 바꾸라고 제안 하시겠습니까? – awj

+0

@awj 사용법에 대한 최신 게시물을 참조하십시오. 어쨌든,이 클래스는 public이고 이미 구현되어 있습니다. html을 빌드 할 때 HtmlTextWriter는 XElement보다 훨씬 간단하고 강력합니다. XElement가 더 일반적입니다. – archil

0

HtmlTextWriter?를 사용하지 것이다 (스팬), 속성 (속성 id, 값 내용)을 추가 한 다음 그 내용을 "hello world"로 설정하십시오. 이 xmlelement를 가져 와서 올바른 위치의 트리에 추가하십시오.

이 모든 것이 나에게 잘못된 방향으로 향하는 것 같습니다. 코드 뒤에 "동적 인"내용을 넣고 싶다면 asp:label 또는 aps:placeholder 컨트롤을 페이지에 추가 한 다음 해당 컨트롤의 내용을 코드 뒤에 html로 설정하십시오. 이것이 동적 컨텐츠를 추가하는 표준 방법입니다.

+0

이 방법으로 내용을 작성하는 이유는 페이지의 요소를 캐시하고 싶다는 것입니다. 이러한 요소가 발생하려면 직렬화가 가능해야합니다. XElement의 내용은 CMS의 HTML 필드에서 가져옵니다. XElement를 사용하여 HTML을 포함하는 결과를 얻으려고하는 이유를 모든 독자에게 설명하기를 바랍니다. – awj

+0

@awj - 아무 문제가 없습니다. 'asp : placeholder'는 데이터베이스의 문자열을 잘 처리 할 수 ​​있습니다. 아무것도 문자열보다 직렬화 할 수 없습니다. – Hogan

+0

@awj - 실제로'asp : literalcontrol' 또는'asp : label'가 아마도 당신이 원하는 것일 것입니다. 어떻게 사용하는지 예제를 게시하길 원하십니까? – Hogan

0

HTML 문자열을 계층 적 개체로 변환하기 위해 HtmlAgilitypack을 사용하여이 문제를 해결했습니다.

다음이 개체의 각 HTML 요소를 반복하고 각 개체에 대해 중첩 된 XElement를 만들었습니다.

모든 요소에 대한 요구 사항을 확인하는 데 약간의 문제가 있지만 완벽하게 작동하며 코드를 작성하는 데 예상했던 것보다 적은 코드 행을 사용합니다. 내가 가장 내 XElement를 객체로의 지정된 HtmlTextWriter을 구현하는 방법을 잘 모르겠어요 내 제한된 지식 있도록

관련 문제