创建带自定义格式的XML文件:属性及标签需含换行制表符
解决XML属性和标签中包含换行、制表符的问题
我明白你想要在XML的属性和部分标签文本里加入换行(\n)和制表符(\t),但之前的代码没达到预期效果对吧?咱们来一步步解决这个问题:
问题根源分析
你之前的代码是先拼接XML字符串再用XDocument.Parse处理,还尝试了XmlTextWriter,但这里有两个核心问题:
- 手动拼接的字符串里没实际包含你需要的换行/制表符内容
- XML解析和序列化过程中,空白字符可能被自动处理或忽略
方案一:直接构造XML结构(推荐)
这种方式最可控,不需要手动拼接字符串,直接通过XElement、XAttribute来构建,能直接插入换行和制表符:
// 直接构建XML文档 XDocument doc = new XDocument( new XDeclaration("1.0", "UTF-8", null), new XElement("PersonLib", new XAttribute("Version", "1.0"), // 给Person元素的Info属性加入制表符和换行 new XElement("Person", new XAttribute("Info", $"姓名:\t张三\n年龄:\t25"), // 标签文本里加入换行和制表符 new XText($"个人简介:\n\t爱好:读书\n\t职业:程序员") ) ) ); // 配置XmlWriter的选项 XmlWriterSettings settings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true, // 让XML整体格式化缩进,不影响内容里的空白 OmitXmlDeclaration = false, NewLineHandling = NewLineHandling.None // 保留内容里的原始换行符 }; // 序列化XML并输出 using (StringWriter sw = new StringWriter()) using (XmlWriter writer = XmlWriter.Create(sw, settings)) { doc.Save(writer); string finalXml = sw.ToString(); Console.WriteLine(finalXml); }
运行这段代码后,你会得到包含预期换行和制表符的XML,属性和文本里的空白都会被正确保留。
方案二:用字符串解析的方式(兼容已有字符串场景)
如果一定要从字符串解析XML,记得用XML字符实体来表示换行和制表符(避免解析时被忽略),同时开启空白保留选项:
// 注意:XML里用	表示制表符,
表示换行 string xmlID = @"<?xml version=""1.0"" encoding=""UTF-8""?> <PersonLib Version=""1.0""> <Person Info=""姓名:	张三
年龄:	25"">个人简介:
	爱好:读书
	职业:程序员</Person> </PersonLib>"; // 解析时开启PreserveWhitespace,保留所有空白字符 XDocument doc = XDocument.Parse(xmlID, LoadOptions.PreserveWhitespace); XmlWriterSettings settings = new XmlWriterSettings { Indent = true, OmitXmlDeclaration = false, NewLineHandling = NewLineHandling.None // 不替换原始换行符 }; using (StringWriter sw = new StringWriter()) using (XmlWriter writer = XmlWriter.Create(sw, settings)) { doc.Save(writer); string finalXml = sw.ToString(); Console.WriteLine(finalXml); }
关键注意点
NewLineHandling.None:这个设置很重要,它会让XmlWriter保留你手动添加的换行符,不会自动替换成系统默认的换行格式- 直接构造XML比字符串拼接更不容易出错,尤其是处理特殊字符时
- XML属性里的换行和制表符不需要额外转义(除了XML本身的特殊字符:&、<、>、"、'),直接用
\n和\t就行
内容的提问来源于stack exchange,提问作者Programmerzzz
相关产品推荐
相关产品推荐

