2013-02-22 5 views
1

Я использую xmlTextWriter для создания xml.Как написать '&' в xml?

writer.WriteStartElement("book"); 
writer.WriteAttributeString("author", "j.k.rowling"); 
writer.WriteAttributeString("year", "1990"); 
writer.WriteString("&"); 
writer.WriteEndElement(); 

Но теперь я должен писать «&», но XmlTextWriter автоматически запишет этот как «& усилителя»; Так есть ли какая-нибудь работа, чтобы сделать это?

Я создаю XML, читая DOC file.So если я читаю «-», то в XML мне нужно написать «& Ndash», так при написании он пишется как «& усилителя»; Ndash..

Так, например, если я пытаюсь написать узел с текстом good-bad, мне действительно нужно написать свой XML, такой как <node>good&ndash;bad</node>. Это требование моего проекта.

+0

Зачем вам нужно писать недопустимый XML? – Quentin

+0

Я не следую твоему правлению. Можете ли вы добавить обычную текстовую (некодированную) версию того, что вы пытаетесь написать в XML? '& ndash' является символом HTML-символа, поэтому он не должен быть необходимым в файле XML. – psubsee2003

+0

Как и то, что xmlwriter делает для «&» eg (& amp), мне нужно сделать для «-», например (& ndash). – Giri

ответ

6

в надлежащем файле XML, вы не можете иметь автономный & характер, если она не является маскирующим. Поэтому, если вам нужен узел XML, содержащий good&ndash;bad, тогда он должен быть закодирован как good&amp;ndash;bad. Не существует обходного пути, так как ничего другого не будет действительным XML. Единственный способ заставить его работать - просто написать XML-файл в виде обычного текста, как вы этого хотите, но затем он не может быть прочитан синтаксическим анализатором XML, поскольку он не является надлежащим XML.

Вот пример кода моего предложил обходной путь (вы не указали язык, поэтому я покажу вам, в C#, но Java должны иметь что-то подобное):

using(var sw = new StreamWriter(stream)) 
{ 
    // other code to write XML-like data 
    sw.WriteLine("<node>good&ndash;bad</node>"); 
    // other code to write XML-like data 
} 

Как вы обнаружили, другой вариант заключается в использовании метода WriteRaw() на XmlTextWriter (в C#), который напишет незарегистрированную строку, но это не изменит факт, что он не будет действительным XML-файлом, когда это будет сделано.

Но, как я уже упоминал, если вы попытаетесь прочитать это с помощью XML-анализатора, это не сработает, потому что &ndash не является допустимым символом XML-символа, поэтому он недействителен XML.

&ndash; - объект символа HTML, поэтому избежать его в XML обычно не требуется.

В языке XML & является символом escape, поэтому &amp; соответствует строчному представлению &. Вы не можете использовать только & характера, так как & персонаж имеет особый смысл и, следовательно, один & символа будет неправильно истолкован анализатором/

Вы увидите подобное поведение с <,>,», и» символы.Все имеют смысл в XML-языке, поэтому, если вам нужно представить их как текст в документе.

Вот ссылка на все объекты символов в XML (and HTML) из Википедии. Каждый из них всегда будет отображаться символом эвакуации и именем (&gt;, &lt;, &quot;, &apos;)

+0

Спасибо .. Но писатель.WriteRaw ("–"); также работает. – Giri

+0

@Giri это правда (но было непонятно, что вы используете C#), но дело в том, что это не допустимый XML, поэтому стандартный синтаксический анализатор XML будет иметь проблемы с его анализом создаваемого вами «XML». – psubsee2003

+0

Извините за это, и мы пишем наш собственный синтаксический анализатор для чтения xml. – Giri

1

В XML, & должно быть экранировано как &amp;. Символ & зарезервирован для объектов и, таким образом, не допускается иначе. Объекты используются для пропуска символов с особыми значениями в XML.

Другое программное обеспечение, читающее XML, должно снова декодировать объект. &lt; для < и &gt; для > или других примеров, некоторые другие языки, такие как HTML, основанные на XML, предоставляют еще больше.

-1

Думаю, вам нужно его закодировать. Как так:

colTest = "&" 
writer.WriteEncodedText(colTest) 
+0

'WriteEncodedText()' не является методом на 'XmlTextWriter'. Это метод класса HtmlTextWriter. – psubsee2003

Смежные вопросы