从C#Linq中的xml元素外的xml读取和删除无效字符到Xml

时间:2011-04-05 06:44:05

标签: c# xml linq

我在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);
            }
        }

1 个答案:

答案 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