【问题标题】:How keep carriage return from parsing XML如何防止回车解析 XML
【发布时间】:2011-12-05 10:58:31
【问题描述】:

我在网上寻找如何保留 XML 数据的回车,但我找不到答案,所以我在这里 :)

目标是在文件中写入 XML 数据的内容。因此,如果节点的值包含一些“\r\n”数据,软件需要将它们写入文件以创建新行,但它不写入,即使有空格:保留。

这是我的测试类:

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;
}

有人有想法吗?

【问题讨论】:

  • 您应该将这些数据放入 因为 XML 会尝试解析它们。
  • 它的工作是 xml 解析器将不同的换行符标准化为 \n。所以这是默认行为。

标签: c# xml linq c#-4.0 linq-to-xml


【解决方案1】:

如果您想在保存XDocumentXElement 时在元素或属性内容中保留cr lf,您可以使用某些XmlWriterSettings,即NewLineHandling 来实现:

        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”。

【讨论】:

    【解决方案2】:

    这是我找到的一个有用的链接,用于解析带有回车符和换行符的 Xml 字符串。

    howto-correctly-parse-using-xelementparse-for-strings-that-contain-newline-character-in

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

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多