簡體   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