我在C#linq中读取xml时遇到问题。
当我尝试使用以下语句读取xml文档时:
XDocument xdoc = XDocument.Load(path);
它会抛出这样的异常。
根级别的数据无效。第1行,第1位。
当我打开我试图读取的xml文件时,我在xml声明之前发现了一个无效字符。这是宣言:
?<?xml version="1.0" encoding="utf-8"?>
我知道声明开头的问号不应该存在。
我有三个问题
1)如何在C#linq中读取这个无效的xml到xml?
2)如何在C#中的xml中删除任何类型的无效字符?
3)如何在c#linq to xml中创建xml时防止出现这类无效字符?
xml示例:?<?
十六进制当量:3f 3c 3f
以下是我用来创建它的代码:
XDocument xdoc = new XDocument();
xdoc.Add(new XElement("TaskAlert"));
AddParentNodeInTaskAlertXml(ref xdoc, userId);
and so on......
我无法理解为什么它会在某个时候添加这样的字符。
以下是我用来创建或加载文件的一些代码:
public static void CreateUpdateTaskAlertXmlFile(int userId)
{
try
{
string path = string.Format("{0}\\{1}\\{2}", Application.StartupPath, "Configuration",
"TaskAlert.xml");
if (userId.Equals(0))
userId = Utility.Application.CurrentUser.UserId;
XDocument xdoc;
LoadTaskAlertXml(out xdoc, path, userId);
xdoc.Save(path);
}
catch (Exception exception)
{
MSLib.HandleException(exception);
}
}
public static void LoadTaskAlertXml(out XDocument xdoc, string path, int userId)
{
xdoc = null;
TaskCollection tasks = TaskEntity.GetOverDueTasks(userId);
if (!File.Exists(path))
{
CreateTaskAlertXml(userId.ToString(), ref xdoc);
AddOverDueTasksInTaskAlertXml(xdoc, userId.ToString(), tasks, false);
}
else
{
xdoc = XDocument.Load(path);
XElement userElement =
xdoc.Descendants("User").Where(x => x.Attribute("Id").Value.Equals(userId.ToString())).
SingleOrDefault();
if (userElement == null)
{
AddParentNodeInTaskAlertXml(ref xdoc, userId.ToString());
AddOverDueTasksInTaskAlertXml(xdoc, userId.ToString(), tasks, false);
}
else
AddOverDueTasksInTaskAlertXml(xdoc, userId.ToString(), tasks, true);
}
}
答案 0 :(得分:3)
LINQ to XML不会创建一个无效的文件,因此问题3没有实际意义。
LINQ to XML仅用于读取有效的XML。你应该找出为什么你最终开始使用无效的XML,并找出根本原因。尝试修复已经无效的文件通常是一个坏主意,特别是在不了解根本原因的情况下 - 你永远不知道其他问题可能潜伏在拐角处。
我怀疑额外的字符最初是一个字节顺序标记,但它被其他东西破坏了。如果您可以首先向我们提供有关您如何创建文件的更多信息,那将会有很大帮助。 LINQ to XML可以读取以有效BOM开头且没有问题的文件。
我建议您查看二进制编辑器中的文件,并使用文件开头的字节编辑您的问题。有效的UTF-8 BOM将为0xEF,0xBB,0xBF。
编辑:听起来好像是你创建文件的方式。例如,这应该是绝对正确的:using System.Xml.Linq;
class Test
{
static void Main()
{
XDocument doc = new XDocument();
doc.Add(new XElement("Test"));
doc.Save("test.xml");
}
}
创建一个带有有效字节顺序标记的文件。请显示一个没有的同等程序,或者准确调查您对该文件的处理方式,例如:通过FTP复制。
顺便说一句,你真的需要在ref
的电话中使用AddParentNodeInTaskAlertXml
吗?对我来说似乎不太可能。如果您不太确定ref
的真正含义,请参阅我的parameter passing article。