Как сохранить возврат каретки от разбора XML - PullRequest
8 голосов
/ 05 декабря 2011

Я смотрю в Интернете, как сохранить возврат каретки от данных XML, но я не смог найти ответ, поэтому я здесь:)

Цель состоит в том, чтобы записать в файл содержимое данных XML. Таким образом, если значение узла содержит некоторые данные "\ r \ n", программному обеспечению необходимо записать их в файл, чтобы создать новую строку, но он не записывает, даже с пробелом: preserve.

Вот мой тестовый класс:

XElement xRootNode = new XElement("DOCS");
XElement xData = null;

//XNamespace ns = XNamespace.Xml;
//XAttribute spacePreserve = new XAttribute(ns+"space", "preserve");
//xRootNode.Add(spacePreserve);

xData = new XElement("DOC");
xData.Add(new XAttribute("FILENAME", "c:\\titi\\prout.txt"));
xData.Add(new XAttribute("MODE", "APPEND"));
xData.Add("Hi my name is Baptiste\r\nI'm a lazy boy");

xRootNode.Add(xData);

bool result = Tools.writeToFile(xRootNode.ToString());

А вот мой класс процесса:

try
{
    XElement xRootNode = XElement.Parse(xmlInputFiles);
    String filename = xRootNode.Element(xNodeDoc).Attribute(xAttributeFilename).Value.ToString();
    Boolean mode = false;
    try
    {
         mode = xRootNode.Element(xNodeDoc).Attribute(xWriteMode).Value.ToString().ToUpper().Equals(xWriteModeAppend);
    }
    catch (Exception e)
    {
         mode = false;
    }

    String value = xRootNode.Element(xNodeDoc).Value;
    StreamWriter destFile = new StreamWriter(filename, mode, System.Text.Encoding.Unicode);

    destFile.Write(value);
    destFile.Close();

    return true;
}
catch (Exception e)
{
    return false;
}

У кого-нибудь есть идея?

Ответы [ 2 ]

4 голосов
/ 05 декабря 2011

Если вы хотите сохранить cr lf в элементе или атрибуте содержимого при сохранении XDocument или XElement, вы можете сделать это, используя определенные XmlWriterSettings, а именно NewLineHandling для Entitize:

        string fileName = "XmlOuputTest1.xml";

        string attValue = "Line1.\r\nLine2.";
        string elementValue = "Line1.\r\nLine2.\r\nLine3.";

        XmlWriterSettings xws = new XmlWriterSettings();
        xws.NewLineHandling = NewLineHandling.Entitize;

        XDocument doc = new XDocument(new XElement("root",
                                      new XAttribute("test", attValue),
                                      elementValue));

        using (XmlWriter xw = XmlWriter.Create(fileName, xws))
        {
            doc.Save(xw);
        }

        doc = XDocument.Load(fileName);
        Console.WriteLine("att value: {0}; element value: {1}.",
                           attValue == doc.Root.Attribute("test").Value,
                           elementValue == doc.Root.Value);

В этом примере значение сохраняется в циклическом цикле сохранения и загрузки, поскольку выходной результат выборки равен "att value: True; значение элемента: True."

0 голосов
/ 07 февраля 2014

Вот полезная ссылка, которую я нашел для разбора строки XML с возвратами каррейга и переводами строки в ней.

как правильно правильно анализировать, используя xelementparse-for-strings-that-Содержит-символ новой строки

Это может помочь тем, кто анализирует строку XML.

Для тех, кто не удосуживается щелкнуть ее, говорит, что вместо этого используйте XmlTextReader

   XmlTextReader xtr = new XmlTextReader(new StringReader(xml));
   XElement items = XElement.Load(xtr);
   foreach (string desc in items.Elements("Item").Select(i => (string)i.Attribute("Description")))
   {
       Console.WriteLine("|{0}|", desc);
   }
...