繁体   English   中英

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

[英]Read and Remove invalid characters from xml outside xml elements in C# Linq to Xml

在C#linq中读取xml到xml时遇到问题。

当我尝试使用以下语句读取xml文档时:

XDocument xdoc = XDocument.Load(path);

它引发了这样的异常。

根级别的数据无效。 第1行,位置1。

当我打开要读取的xml文件时,在xml声明之前发现了无效字符。 这是宣言:

?<?xml version="1.0" encoding="utf-8"?>

我知道声明开头不应出现问号。

我有三个问题

1)如何在C#linq to 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);
            }
        }

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复制。

AddParentNodeInTaskAlertXml ,您真的需要在对AddParentNodeInTaskAlertXml的调用中使用ref吗? 对我来说似乎不太可能。 如果您不确定ref真正含义,请参阅我的参数传递文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM