2014-12-05 3 views
2

Я работаю с большим XML-файлом, который занимается локализацией строк в C#. Я не писал программу, которая создает XML, но у меня есть доступ к исходному коду, и я хочу ее изменить, так как он в настоящее время выводит 1.0 в качестве версии, но содержит недопустимые символы в документе.C# XMLTextWriter - XML ​​1.1

Вот как код в настоящее время выписан.

XmlTextWriter xr = new XmlTextWriter(fileName, Encoding.UTF8); 
xr.Formatting = Formatting.Indented; 
xr.Indentation = 4; 
xr.WriteStartDocument(); 
xr.WriteStartElement("tlkFile"); 
// ... 

Однако WriteStartDocument() documentation states использует XML-версию 1.0. Я знаю, что это не работает, потому что я пишу парсер Java, который модифицирует этот XML, и он не может загружаться, потому что он имеет символы Unicode, которые не разрешены. В частности, , который, как представляется, отменяется. Я не уверен, почему это здесь ... файл длиной около 500000 строк.

Я вручную изменил заголовок, прежде чем мой Java-анализатор схватил его до 1.1, и он сработал. Технически я мог бы изменить XML как строку, а затем проанализировать это, но вместо этого я предпочел бы иметь правильный XML.

Я не могу найти способ изменить это. Я не могу изменить инструмент, чтобы использовать какую-либо другую форму написания XML, потому что это общий проект с открытым исходным кодом, который используется, и я не так хорош в C#.

Есть ли уловка для этого?

+1

Как вы указываете контент для записи? Например,' WriteString'? ['WriteString'] (http://msdn.microsoft.com/en-us/library/system. xml.xmlwriter.writestring (v = vs.110) .aspx) имеет несколько замечаний о недопустимых символах. –

+0

XmlTextWriter внутренне использует ['XmlCharType'] (http://referencesource.microsoft.com/#System.Xml/System /Xml/XmlCharType.cs) при записи текстовых данных в документ. Этот тип ограничен символами, которые действительны в XML 1.0. Я очень сомневаюсь, что вы даже можете записать '\ x18' в свой XML-документ обычными способами. – Tomalak

+0

Контент, который записывается, является декомпилированным файлом локализации (Talkfile, TLK), который используется в нереальных машинных играх. Я могу заставить мой java проанализировать и написать его, если я изменил заголовок, чтобы использовать 1.1 вручную. Я просмотрел документацию больше, d Я не думаю, что .NET даже поддерживает 1.l, что отстой. – Mgamerz

ответ

1

Используйте следующий процесс:

  • Создать пользовательскую реализацию IXmlSerializable интерфейса
  • Ручка  с использованием собственного метода
  • использовать экземпляр реализации, чтобы прочитать документ

Литература

0

Вы можете заменить WriteStartDocument() с WriteRaw (»<? XML версия = \ "1,1 \"? > ") и удалить WriteEndDocument()?