2011-04-10 7 views
5

मैं एएसपी.NET पृष्ठ पर कोड-बैक में कुछ HTML बनाने के लिए XElement ऑब्जेक्ट का उपयोग कर रहा हूं।एचटीएमएल सामग्री से बचने System System.Xml.Linq.XElement से कैसे बचें?

मैं कर सकते हैं या इस XElement के लिए कुछ XAttributes नहीं जोड़ सकते हैं के रूप में मैं निम्नलिखित फैशन में साथ जाने,:

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

अब, अगर मैं में कुछ सामग्री जोड़ने के लिए 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 बच निकला है, और पृष्ठ के स्रोत में निम्नलिखित प्रारूप है:

&lt;span id='content'&gt;hello world&lt;/span&gt; 

यह देखते हुए कि मैं जिस XML को संकलित कर रहा हूं वह वैध HTML है, और आंतरिक सामग्री भी मान्य HTML है, मैं XElement पैरेंट ऑब्जेक्ट को पर आंतरिक सामग्री से कैसे बच सकता हूं? मैं इसे अपने मूल प्रारूप में कैसे छोड़ सकता हूं? (अवधि

उत्तर

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

आप HtmlTextWriter?

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' के रूप में चिह्नित है, इसलिए अपने सीमित ज्ञान के साथ मुझे यकीन है कि कैसे मेरे XElement वस्तु में एक HtmlTextWriter लागू करने के लिए सबसे अच्छा नहीं कर रहा हूँ। मुझे पता है कि यह एक बड़ा सवाल है, लेकिन क्या आप एक संक्षिप्त उदाहरण प्रदान कर सकते हैं कि मैं कैसे परिवर्तित करूंगा (मेरे उपर्युक्त उदाहरण का उपयोग करके) ' हैलो वर्ल्ड 'एक HTMLTextWriter ऑब्जेक्ट में? – awj

+0

मुझे यह भी उल्लेख करना चाहिए कि मैं XElement क्लास का उपयोग करने के लिए उत्सुक हूं क्योंकि मैं एक बेस्पाक कैश का उपयोग कर रहा हूं जो XElements स्वीकार करता है, लेकिन मुझे यकीन नहीं है कि यह HtmlTextWriter का उदाहरण स्वीकार करेगा या नहीं। इसके अलावा, क्या आप सुझाव दे रहे हैं कि मैं पूरे एक्सएलमेंट को एचटीएमएल टेक्स्टक्वाइटर के साथ प्रतिस्थापित करने के बजाय आंतरिक HTML को बस रखने के बजाय प्रतिस्थापित करता हूं? – awj

+0

@awj उपयोग के बारे में मेरी अद्यतन पोस्ट देखें। मैं समझ नहीं पा रहा हूं कि आप किस चीज के बारे में बात कर रहे हैं, लेकिन वैसे भी, यह वर्ग सार्वजनिक है और पहले ही लागू हो चुका है। मेरा सुझाव है कि एचटीएमएल बनाने के लिए, एचटीएमएलटेक्स्टवाइटर XElement से कहीं अधिक सरल और शक्तिशाली है। XElement अधिक सामान्य है – archil

0

उपयोग क्यों नहीं करेंगे आप XML के रूप में एचटीएमएल इलाज कर रहे हैं तो जब आप इसे करने के लिए जोड़ देते हैं तो आप XML

जोड़ने के लिए इस प्रकार आप एक नया XmlElement होगा है), एक विशेषता जोड़ें (विशेषता आईडी, मूल्य सामग्री के लिए) और उसके बाद इसकी सामग्री "हैलो वर्ल्ड" पर सेट करें। इस xmlelement लो और इसे सही जगह में पेड़ में जोड़ें।

यह सब मेरे लिए गलत दिशा में आगे बढ़ रहा है। यदि आप पीछे दिए गए कोड में "गतिशील" सामग्री प्राप्त करने में सक्षम होना चाहते हैं तो मैं सुझाव दूंगा: asp:label या aps:placeholder पृष्ठ पर नियंत्रण जोड़ना और फिर उस नियंत्रण की सामग्री को पीछे दिए गए कोड में HTML पर सेट करना। गतिशील सामग्री जोड़ने का यह मानक तरीका है।

+0

इस कारण सामग्री का निर्माण करने का कारण यह है कि मैं पृष्ठ के तत्वों को कैश करना चाहता हूं - ऐसा करने के लिए इन तत्वों को क्रमिक होना चाहिए। XElement के अंदर की सामग्री एक HTML फ़ील्ड से एक सीएमएस में आ रही है। मुझे उम्मीद है कि मेरे प्रश्न के सभी पाठकों को बताएं कि मैं HTML को शामिल करने के लिए XElement का उपयोग करके परिणाम प्राप्त करने के लिए क्यों देख रहा हूं। – awj

+0

@awj - इसके साथ कुछ भी गलत नहीं है। एक 'asp: प्लेसहोल्डर' आपके डेटाबेस से स्ट्रिंग को ठीक से संभाल सकता है। एक स्ट्रिंग की तुलना में कुछ भी serializable नहीं है। – Hogan

+0

@awj - वास्तव में एक 'asp: literalcontrol' या' asp: label' शायद आप जो चाहते हैं। क्या आप चाहते हैं कि मैं इसका उपयोग कैसे करूं? – Hogan

0

मैंने HTML की स्ट्रिंग को एक पदानुक्रमित वस्तु में परिवर्तित करने के लिए HtmlAgilitypack का उपयोग करके इसे हल किया।

फिर मैंने इस ऑब्जेक्ट में प्रत्येक HTML तत्व के माध्यम से looped और प्रत्येक के लिए एक घोंसला XElement बनाया।

प्रत्येक तत्व पर किए जाने की ज़रूरतों की जांच करने की थोड़ी सी बात है, लेकिन यह पूरी तरह से काम करता है और जब मैंने इसे बनाना शुरू किया था तब से कोड की कम लाइनें थीं।