سؤال

إليك بعض الرمز C#:

var sb = new StringBuilder();
var w = XmlWriter.Create(sb);
w.WriteStartElement("hello");
w.WriteAttributeString("target", "world ' \" !");
w.WriteEndElement();
w.Flush();
// then look at sb.ToString()

أحصل على سلسلة تشبه:

 <?xml version="1.0" encoding="utf-16"?><hello target="world ' &quot; !" /> 

إنه يهرب فقط من الكلمة المزدوجة ، وليس الكبولة الواحدة. لكن مستندات XMLWriter.WriteAttributestring (سلسلة ، سلسلة) تقول:

إذا كانت قيمة السمة تتضمن عروض أسعار مزدوجة أو واحدة ، فسيتم استبدالها بـ "و" على التوالي.

هل هناك بعض العلم الذي أحتاج إلى ضبطه لجعله يفعل ما تقوله المستندات؟

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم .NET Reflector للنظر في الكود ، فستجد أن System.xml.xmlTextEncoder.write (سلسلة) يتم استدعاؤه. إليك مدونة الاهتمام:

if (!this.inAttribute || (this.quoteChar != ch))
   this.textWriter.Write('\'');
else
   this.WriteEntityRefImpl("apos");

عند كتابة قيمة السمة ، لا يتم هروب عرض أسعار واحد لأنه لا يلزم أن يكون. فقط عند كتابة عنصر نص يتم استخدامه "".

نصائح أخرى

هذا ليس خطأ في XmlWriter, ، إنه خطأ في نظامك القديم.

إذا نظرت إلى تعريف AttValue في توصية XML 1.0 ، سترى أن XmlWriter يفعل بالضبط ما يفترض أن يفعله: إذا تم تحديد قيمة السمة مع علقات ، يمكن أن تحتوي قيمة السمة على علامات اقتباس ، وإذا تم تحديدها باستخدام علامات الاقتباس ، يمكن أن تحتوي قيمة السمة على عميل.

يمكن ، من المتصور ، استخلاص فئة من XmlTextWriter وتجاوزها WriteAttributes و WriteAttributeString طُرق. التي يمكن أن تعمل. احترس من مساحات الأسماء والترميز إذا قمت بذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top