如何防止回车符解析XML

8

我在互联网上搜索如何在XML数据中保留回车符,但是我找不到答案,所以我来到这里:)

目标是将XML数据的内容写入文件。因此,如果节点的值包含一些"\r\n"数据,则软件需要将它们写入文件以创建新行,但它不会写入,即使使用了 space: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;
}

有人有什么想法吗?


你应该将这样的数据放入 <![CDATA[""]]> 中,因为 XML 会尝试解析它们。 - Rosmarine Popcorn
XML解析器的工作是将不同的换行符规范化为\n。因此,这是默认行为。 - Totonga
2个回答

4

如果您想在保存XDocumentXElement时保留元素或属性内容中的换行符,可以使用特定的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; element value: True。”

1

我发现了一个有用的链接,可以解析包含回车符和换行符的Xml字符串。

如何正确使用XElement.Parse解析包含换行符的字符串

这可能会帮助那些正在解析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);
   }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接