关键词:
【中文标题】使用 C# 使用特殊字符写入 XML 文档【英文标题】:Write in an XML document with C# using special characters 【发布时间】:2017-05-21 19:21:23 【问题描述】:我正在尝试在递归函数中使用 XmlWriter 在 C# 中编写 XML 文件。该文件应该包含给定目录中的每个文件夹以及每个子文件夹和文件。
我在尝试在 XML 文件中写入特殊字符时遇到了一些麻烦,它不断地给我一个错误,
我不能使用'&'、'/'、'-'、'.'、''等字符。
偶数不起作用。我尝试找到与此问题类似的问题,但没有解决方案对我有帮助,我尝试替换包含特殊字符的文件夹和/或文件字符串名称,并使用“&”、“"”、“'”转义它们等等,但这也不起作用。它只是给我一个错误,我不能使用'&'。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml;
namespace XMLgenerator
public class Generator
public void write(string Dir, XmlWriter writer)
try
writer.WriteStartElement("Folders");
foreach (string s in Directory.GetDirectories(Dir))
string[] splitter = s.Split('\\');
string ss = splitter[splitter.Length - 1];
string ssxml = XmlConvert.EncodeLocalName(ss);
writer.WriteStartElement("Folder");
writer.WriteAttributeString("name", ssxml);
foreach (string f in Directory.GetFiles(s))
string fxml = XmlConvert.EncodeLocalName(f);
FileInfo fi = new FileInfo(f);
long length = fi.Length;
writer.WriteElementString(fxml, length.ToString());
writer.WriteEndElement();
write(s,writer);
writer.WriteEndElement();
catch (UnauthorizedAccessException ex)
Console.WriteLine(ex.Message);
return;
catch (IOException ex)
Console.WriteLine(ex.Message);
return;
// Method for creating an XML file and also getting directories and files. File name and dir path are parametres
public void generateContent(string Dir)
XmlWriterSettings xws = new XmlWriterSettings();
xws.Encoding = new UTF8Encoding();
using (XmlWriter writer = XmlWriter.Create("test.xml", xws))
writer.WriteStartDocument();
write(Dir,writer);
writer.WriteEndDocument();
【问题讨论】:
;
之前的空格使转义字符无效。 &
是 '&' 而 &amp ;
是 '&'还有HttpUtility.HtmlEncode and System.Security.SecurityElement.Escape,因此您无需为每个可能的无效字符编码。
嘿,保罗,我刚刚在这个问题中留出了那个空间,因为没有它它会在这里正确翻译,所以它不是 &,而是给出了实际的 &
【参考方案1】:
您正试图在 XML 元素名称中包含 '&'、'/'、'-'、'.'、' ' 等等。。其中一些例如“&”根本不能包含在元素名称中,而其他一些例如“-”和数字可以包含——只是不能作为第一个字符。 XML Standard 4th edition(即 currently supported by XmlWriter
版本)定义名称中的有效字符如下:
[4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender
[5] Name ::= (Letter | '_' | ':') (NameChar)*
在哪里Letter
、Digit
等。人。定义here。请注意,字母必须在前。
由于您的ss
字符串可能包含无效字符,您可以根据需要使用XmlConvert.EncodeLocalName()
进行转义,然后在读取XML 时使用XmlConvert.DecodeName()
恢复原始字符串。
因此,您的代码如下所示:
public void write(string Dir, XmlWriter writer)
try
writer.WriteStartElement("Folders");
foreach (string directoryPath in Directory.GetDirectories(Dir))
string directoryName = Path.GetFileName(directoryPath);
writer.WriteStartElement(XmlConvert.EncodeLocalName(directoryName));
foreach (string fileName in Directory.GetFiles(directoryPath))
FileInfo fi = new FileInfo(fileName);
writer.WriteElementString(XmlConvert.EncodeLocalName(fileName), XmlConvert.ToString(fi.Length));
writer.WriteEndElement();
write(directoryPath, writer);
writer.WriteEndElement();
catch (UnauthorizedAccessException ex)
Console.WriteLine(ex.Message);
return;
catch (IOException ex)
Console.WriteLine(ex.Message);
return;
但是,我建议使用固定元素名称的替代方法,正如@PaulAbbott 所推荐的那样,它将目录和文件名存储为属性值:
public void write(string Dir, XmlWriter writer)
try
writer.WriteStartElement("Folders");
foreach (string directoryPath in Directory.GetDirectories(Dir))
string directoryName = Path.GetFileName(directoryPath);
writer.WriteStartElement("Folder");
writer.WriteAttributeString("Name", directoryName);
foreach (string fileName in Directory.GetFiles(directoryPath))
FileInfo fi = new FileInfo(fileName);
writer.WriteStartElement("File");
writer.WriteAttributeString("Name", fileName);
writer.WriteValue(fi.Length);
writer.WriteEndElement();
write(directoryPath, writer); // I moved this inside the outer <Folder> tag.
writer.WriteEndElement();
writer.WriteEndElement();
catch (UnauthorizedAccessException ex)
Console.WriteLine(ex.Message);
return;
catch (IOException ex)
Console.WriteLine(ex.Message);
return;
这应该会产生更具可读性的 XML,例如:
<Folders>
<Folder Name="WpfApplication1">
<File Name="D:\Temp\Question27864746 XMLapp\WpfApplication1\WpfApplication1.sln">1014</File>
<File Name="D:\Temp\Question27864746 XMLapp\WpfApplication1\WpfApplication1.v12.suo">84992</File>
<Folders>
<Folder Name="WpfApplication1">
<File Name="D:\Temp\Question27864746 XMLapp\WpfApplication1\WpfApplication1\App.config">187</File>
<File Name="D:\Temp\Question27864746 XMLapp\WpfApplication1\WpfApplication1\App.xaml">326</File>
</Folder>
</Folders>
</Folder>
</Folders>
【讨论】:
我什至没有意识到他正在用文件夹名称创建元素名称。这是一个非常糟糕的主意,因为您不可能为它编写 XSD。像<folders><folder name="asdf">...
这样的东西会比<folders><asdf>...
好很多,并且可以避免文件夹名称以数字开头的问题。
@PaulAbbott - 同意。
嘿,非常感谢你们,我接受了你们的建议,一切都很好。能否请教一下如何让元素和元素串形成一棵树一样的形状?
@LukaZdravkovic - 我的更新回答了你的问题吗?【参考方案2】:
不要尝试修复您的 xml,而是使用 Linq2Xml 来实现类似的事情。
我会这样做(没有字符串处理,没有特殊的字符处理)
XElement Dir2Xml(string dir)
var dInfo = new DirectoryInfo(dir);
var files = new XElement("files");
foreach(var f in dInfo.GetFiles())
files.Add(new XElement("file", f.FullName)); //or use "f.Name" whichever you like
foreach (var d in dInfo.GetDirectories())
files.Add(new XElement("directory", new XAttribute("name", d.Name), Dir2Xml(d.FullName)));
return files;
var xmlstring = Dir2Xml(@"c:\temp").ToString();
【讨论】:
使用特殊字符反序列化 XML 的快速方法
】使用特殊字符反序列化XML的快速方法【英文标题】:fastwaytodeserializeXMLwithspecialcharacters【发布时间】:2011-06-2110:55:55【问题描述】:我正在寻找反序列化xml的快速方法,其中包含特殊字符,例如ö。我使用的是XMLReader,但它无... 查看详情
如何使用 C# 通过读取另一个 XML 文件来创建 XML 文档?
】如何使用C#通过读取另一个XML文件来创建XML文档?【英文标题】:HowdoyoucreateXMLdocumentfromreadinganotherXMLfileusingC#?【发布时间】:2021-12-1403:33:21【问题描述】:我正在尝试重新创建一个xml文档。我正在阅读现有的xml文档,然后尝试... 查看详情
使用 C# LINQ 解析 XML 文档
】使用C#LINQ解析XML文档【英文标题】:ParseanXMLdocumentusingC#LINQ【发布时间】:2021-08-1605:47:14【问题描述】:我正在尝试解析这个XML文档-<?xmlversion="1.0"encoding="UTF-8"?><Dataxmlns:data="report"><Report><GroupNameDescriptor="Administr 查看详情
如何使用 C# 映射反序列化 XML 文档
】如何使用C#映射反序列化XML文档【英文标题】:HowtoMappingDeserializeXMLdocumentusingc#【发布时间】:2021-03-2614:22:57【问题描述】:我是C#编程的新手,我陷入了如何反序列化这个XML文档,我看过这个教程HowtoDeserializeXMLdocument,它很有... 查看详情
if else 语句使用包含多个特殊字符的 char[] C#
】ifelse语句使用包含多个特殊字符的char[]C#【英文标题】:ifelsestatementusingchar[]containingmultiplespecialcharactersC#【发布时间】:2014-01-0807:21:25【问题描述】:我正在尝试使用char[]为特殊字符构建ifelse语句...如果TextBox1包含所有字符,... 查看详情
xml中必须进行转义的字符
...;","<",">"再写入文件中。例如,如果在XML文档中使用类似"<"的字符,那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。下面是五个在XML文档中预定义好的实体:& 查看详情
如何使用 mfc 应用程序在文件中写入特殊字符?
】如何使用mfc应用程序在文件中写入特殊字符?【英文标题】:HowtowriteSpecialcharactersinafileusingmfcapplication?【发布时间】:2014-03-1012:16:47【问题描述】:我想写像ô这样的特殊字符。ö,`a¹½^ 在一个文件中。我在MFC中工作并使用UNIC... 查看详情
在 xml 中保留特殊字符
...储了一个带有换行符的xml字符串。在我的C#3.5程序中,我使用Linqtoxml加载和操作它,然后在UI表单的文本框控件中将其显示为字符串。我需要缩进这个xml并在UI中显示它时保留换行符/回车符。我可以缩进,但是如何在xml中保留LF/CR... 查看详情
如何使用 C# 在 XML 文档中添加新元素
】如何使用C#在XML文档中添加新元素【英文标题】:HowtoAddanewelementinXMLdocumentusingc#【发布时间】:2020-08-3013:04:39【问题描述】:我需要向已经存在的XML文档添加一个新元素。这是XML:而我需要的是将此元素添加到元素的末尾<DAT... 查看详情
在 C# 中使用 Linq to XML 在文档中搜索不同的 XML 结构
】在C#中使用LinqtoXML在文档中搜索不同的XML结构【英文标题】:SearchingfordistinctXMLstructuresinadocumentwithLinqtoXMLinC#【发布时间】:2019-11-0317:27:13【问题描述】:我编写了一个小C#来解析XML文档中的许多元素并只返回那些具有不同子结... 查看详情
带有特殊字符的 XML 在 C# 中转换为 Json
】带有特殊字符的XML在C#中转换为Json【英文标题】:XMLwithspecialcharsconvertingtoJsoninC#【发布时间】:2020-03-1321:59:02【问题描述】:我正在尝试将带有特殊字符(Tab)的XML转换为Json以获取以下xml:<Request><HEADER><uniqueID>20... 查看详情
如何使用 C# ASP.Net 从 XML 文档中获取特定 XML 元素的列表?
】如何使用C#ASP.Net从XML文档中获取特定XML元素的列表?【英文标题】:HowtogetlistofspecificXMLelementsfromXMLdocumentusingC#ASP.Net?【发布时间】:2020-07-1008:32:39【问题描述】:我正在尝试从XML文档中获取一组特定的元素,以使用XSLT文件显... 查看详情
如何转义字符串以在 Scala 中的 XML/HTML 文档中使用?
】如何转义字符串以在Scala中的XML/HTML文档中使用?【英文标题】:HowtoescapeastringforuseinXML/HTMLdocumentinScala?【发布时间】:2013-06-2212:43:41【问题描述】:具体来说,在字符串中替换特殊XML字符的最简单和最惯用的方法是什么。例如... 查看详情
使用 XSLT 转换 xml 中的特殊字符
】使用XSLT转换xml中的特殊字符【英文标题】:ConvertingspecialcharactersinxmlusingXSLT【发布时间】:2017-07-2116:26:18【问题描述】:我正在尝试使用xslt将xml中的特殊字符转换为它们的编码形式。例子:&to&"to"<to<>... 查看详情
使用 C# 正则表达式替换 XML 元素内容
】使用C#正则表达式替换XML元素内容【英文标题】:UsingC#RegularexpressiontoreplaceXMLelementcontent【发布时间】:2010-10-0116:38:45【问题描述】:我正在编写一些处理记录xml数据的代码,并且我希望能够替换文档中某些元素(例如密码)... 查看详情
使用非法特殊字符 (&) 解析 XML [重复]
】使用非法特殊字符(&)解析XML[重复]【英文标题】:ParsingXMLwithillegalspecialcharacters(&)[duplicate]【发布时间】:2021-07-2403:20:27【问题描述】:我有成千上万的XML文件,比如follow<names><Id>1518845</Id><Name>Confessionsofa... 查看详情
如何使用 fast-csv 将特殊字符写入节点中的 csv 文件
】如何使用fast-csv将特殊字符写入节点中的csv文件【英文标题】:HowdoIwritespecialcharacterstocsvfileinnodewithfast-csv【发布时间】:2021-12-2814:38:00【问题描述】:我有一个包含德语字符的列表,我用fast-csv写入csv文件并给了我不同的字符... 查看详情
使用 C# 将 XML 转换为字符串
】使用C#将XML转换为字符串【英文标题】:ConvertingXMLtostringusingC#【发布时间】:2011-09-0321:45:19【问题描述】:我有如下功能publicstringGetXMLAsString(XmlDocumentmyxml)XmlDocumentdoc=newXmlDocument();doc.LoadXml(myxml);StringWritersw=newStringWriter();XmlT 查看详情