[英]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.