## XmlDocument报错详解
### 一、常见错误及解决方案
#### 1. XML根级别上的数据无效
**问题描述:
在使用 `XmlDocument` 的 `LoadXml` 方法读取 XML 文件时,如果传入的是文件路径而不是 XML 文本,会报错“XML 根级别上的数据无效”。
**原因分析:
`LoadXml` 方法只能接受 XML 文本作为输入,不能接受文件路径,而 `Load` 方法可以接受文件路径、文件流或文本读取器。
**解决方法:
使用 `Load` 方法来加载文件路径。
使用 `LoadXml` 方法来加载 XML 文本。
**代码示例:
```csharp
PRivate void ReadXmlByPath(string filePath)
XmlDocument doc = new XmlDocument();
// 正确的用法
doc.Load(filePath);
// 错误的用法: System.Xml.XmlException: “根级别上的数据无效。 第 1 行,位置 1。”
// doc.LoadXml(filePath);
private void ReadXmlByString(string strXml)
XmlDocument doc = new XmlDocument();
// 错误的用法: System.ArgumentException: “路径中具有非法字符。”
// doc.Load(strXml);
// 正确的用法
doc.LoadXml(strXml);
```
#### 2. 文件未找到或访问被拒绝
**问题描述:
在使用 `XmlDocument` 的 `Load` 方法加载文件时,如果文件路径错误或应用程序没有权限访问该文件,会报错“未能找到文件”或“访问被拒绝”。
**原因分析:
文件路径错误。
应用程序没有足够的权限访问该文件。
**解决方法:
确保文件路径正确。
确保应用程序对文件有足够的访问权限,如果是在 Web 应用中,可以使用绝对路径或通过服务器映射路径。
如果是 WinForms 程序,可以使用 `Application.StartupPath` 获取应用程序所在路径。
**代码示例:
```csharp
// Web 应用中使用 server.MapPath 获取项目根目录的绝对路径
string filePath = Server.MapPath("~/App_Data/bookstore.xml");
XmlDocument doc = new XmlDocument();
doc.Load(filePath);
```
#### 3. XML文档包含无效字符
**问题描述:
解析 XML 文档时,如果文档中包含无效字符(如全角引号、低位非打印字符等),会报错“无效的字符”。
**原因分析:
XML 文件中包含预定义好的实体,如 `<` 和 `&`。
XML 文件中包含低位非打印字符。
**解决方法:
使用 CDATA 部分包裹特殊字符。
过滤掉低位非打印字符。
**代码示例:
```csharp
// 过滤低位非打印字符
string filteredXml = System.Text.RegularExpressions.Regex.Replace(strXml, @"[\x00\x08]|[\x0B\x0C]|[\x0E\x1F]", "");
XmlDocument doc = new XmlDocument();
doc.LoadXml(filteredXml);
```
#### 4. 重复节点名称导致解析错误
**问题描述:
在解析 XML 文档时,如果存在重复的节点名称,会导致解析错误。
**原因分析:
XML 规范要求同一层级下的节点名称必须是唯一的。
**解决方法:
确保 XML 文档结构正确,避免在同一层级下出现重复的节点名称。
**代码示例:
```xml
```
#### 5. 编码问题导致解析错误
**问题描述:
解析 XML 文档时,如果编码格式不正确,会导致解析错误。
**原因分析:
XML 声明中的编码与实际文件编码不一致。
**解决方法:
确保 XML 声明中的编码与实际文件编码一致,如果文件是 UTF8 编码,则在 XML 声明中指定 `encoding="UTF8"`。
**代码示例:
```xml
```
### 二、常见问题FAQs
#### Q1: `XmlDocument.Load` 与 `XmlDocument.LoadXml` 有什么区别?
**A1:** `XmlDocument.Load` 用于从文件路径、流或文本读取器加载 XML 文档,而 `XmlDocument.LoadXml` 仅用于从字符串加载 XML 文本,如果尝试用 `LoadXml` 加载文件路径,会抛出异常。
#### Q2: 如何确保应用程序对 XML 文件有访问权限?
**A2:** 确保文件路径正确,并且应用程序账户对该文件有读取权限,在 Web 应用中,可以使用绝对路径或通过服务器映射路径(如 `Server.MapPath`)来获取文件路径,在 WinForms 应用中,可以使用 `Application.StartupPath` 获取应用程序所在路径。