我收到“意外的XML声明.XML声明必须是文档中的第一个节点,并且在尝试加载xml时,不允许出现空格字符”。我的C#代码和XML文件的内容都在下面给出。 XML定义存在于xml文件的第6行,因此存在错误。
我无法控制xml文件中的内容,因此如何使用C#编辑/重写它,以便首先出现xml声明然后加载注释而不会出现任何错误!
//xmlFilepath is the path/name of the xml file passed to this function
static function(string xmlFilepath)
{
XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.IgnoreComments = true;
readerSettings.IgnoreWhitespace = true;
XmlReader reader = XmlReader.Create(XmlFilePath, readerSettings);
XmlDocument xml = new XmlDocument();
xml.Load(reader);
}
XmlDoc.xml
<!-- Customer ID: 1 -->
<!-- Import file: XmlDoc.xml -->
<!-- Start time: 8/14/12 3:15 AM -->
<!-- End time: 8/14/12 3:18 AM -->
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
-----
答案 0 :(得分:13)
如错误所述,XML文档的前五个字符应为<?xml
。没有ifs,ands或buts。您在开始XML标记之上的注释是非法的;它们必须进入XML标记(因为注释结构本身是由XML标准定义的,因此在主XML标记之外没有意义)。
编辑:根据OP的文件格式,这样的事情应该可以重新排列行:
var lines = new List<string>();
using (var fileStream = File.Open(xmlFilePath, FileMode.Open, FileAccess.Read))
using(var reader = new TextReader(fileStream))
{
string line;
while((line = reader.ReadLine()) != null)
lines.Add(line);
}
var i = lines.FindIndex(s=>s.StartsWith("<?xml"));
var xmlLine = lines[i];
lines.RemoveAt(i);
lines.Insert(0,xmlLine);
using (var fileStream = File.Open(xmlFilePath, FileMode.Truncate, FileAccess.Write)
using(var writer = new TextWriter(fileStream))
{
foreach(var line in lines)
writer.Write(line);
writer.Flush();
}
答案 1 :(得分:5)
这不是有效的XML。
正如错误明确指出的那样,XML声明(<?xml ... ?>
)必须首先。
答案 2 :(得分:1)
我使用以下函数从xml中删除空格:
public static void DoRemovespace(string strFile)
{
string str = System.IO.File.ReadAllText(strFile);
str = str.Replace("\n", "");
str = str.Replace("\r", "");
Regex regex = new Regex(@">\s*<");
string cleanedXml = regex.Replace(str, "><");
System.IO.File.WriteAllText(strFile, cleanedXml);
}
答案 3 :(得分:1)
不要在文件的开头添加任何评论!