Использование XDocument для написания сырого XML - PullRequest
3 голосов
/ 21 января 2010

Я пытаюсь создать электронную таблицу в формате XML Spreadsheet 2003 (чтобы Excel мог ее прочитать). Я пишу документ, используя класс XDocument, и мне нужно получить новую строку в теле одного из тегов <Cell>. При чтении и записи Excel требует, чтобы в файлах была вставлена ​​буквенная строка &#10;, чтобы правильно отображать новую строку в электронной таблице. Это также записывает это как таковое.

Проблема в том, что XDocument пишет CR-LF (\ r \ n), когда у меня есть новые строки в моих данных, и он автоматически выходит за пределы амперсанда для меня, когда я пытаюсь сделать .Replace() для входной строки, поэтому в конечном итоге &amp;#10; в моем файле, который Excel просто радостно записал в виде строкового литерала.

Есть ли способ заставить XDocument записать литерал &#10; как часть потока XML? Я знаю, что могу сделать это, наследуя от XmlTextWriter, или буквально просто записав файл с помощью TextWriter, но я бы предпочел этого не делать, если это возможно.

Ответы [ 2 ]

3 голосов
/ 21 января 2010

Интересно, может быть, лучше использовать XmlWriter напрямую и WriteRaw?

Быстрая проверка показывает, что XmlDocument делает это немного лучше, но xml и пробелы становятся хитрыми очень быстро ...

2 голосов
/ 29 июня 2011

Я боролся с этой проблемой в течение нескольких дней и наконец нашел это решение. Я использовал метод XMLDocument.Save(Stream), затем получил отформатированную строку XML из потока. Затем я заменил вхождения &amp;#10; на &#10; и использовал TextWriter для записи строки в файл.

string xml = "<?xml version=\"1.0\"?><?mso-application progid='Excel.Sheet'?><Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:html=\"http://www.w3.org/TR/REC-html40\">";
xml += "<Styles><Style ss:ID=\"s1\"><Alignment ss:Vertical=\"Center\" ss:WrapText=\"1\"/></Style></Styles>";
xml += "<Worksheet ss:Name=\"Default\"><Table><Column ss:Index=\"1\" ss:AutoFitWidth=\"0\" ss:Width=\"75\" /><Row><Cell ss:StyleID=\"s1\"><Data ss:Type=\"String\">Hello&amp;&#35;10;&amp;&#35;10;World</Data></Cell></Row></Table></Worksheet></Workbook>";

System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.LoadXml(xml); //load the xml string
System.IO.MemoryStream stream = new System.IO.MemoryStream();
doc.Save(stream); //save the xml as a formatted string
stream.Position = 0; //reset the stream position since it will be at the end from the Save method
System.IO.StreamReader reader = new System.IO.StreamReader(stream);
string formattedXML = reader.ReadToEnd(); //fetch the formatted XML into a string
formattedXML = formattedXML.Replace("&amp;#10;", "&#10;"); //Replace the unhelpful &amp;#10;'s with the wanted endline entity
System.IO.TextWriter writer = new System.IO.StreamWriter("C:\\Temp\test1.xls");
writer.Write(formattedXML); //write the XML to a file
writer.Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...