无法读取包含“&”符号的XML文档

5

我正在编写一个使用Visual C#读取XML文件的程序。由于文件中包含无效的XML符号,例如'&',因此我读取XML文件时遇到了问题。

我必须读取XML文件,但不能修改文档。我该如何使用C#修改Xml文件?以下是我的代码:

    private void button1_Click(object sender, EventArgs e)
    {
        XmlDocument doc;
        doc = new XmlDocument();
        doc.Load("nuevo.xml");


        XmlNodeList Xpersonas = doc.GetElementsByTagName("personas");
        XmlNodeList Xlista = ((XmlElement)Xpersonas[0]).GetElementsByTagName("edad");

            foreach (XmlElement nodo in Xlista)
            {
                string edad = nodo.GetAttribute("edad");
                string nombre = nodo.InnerText;
                textBox1.Text = nodo.InnerXml;
            }

你想让 XmlDocument 对象接受一个无效的 Xml 文档吗?你能发布一些无效的 Xml 文档吗? - Ron Beyer
这是XmlDocument -> <?xml version="1.0" encoding="utf-8" ?><personas> <nombre>Pablo</nombre> <edad> 34 & 34 </edad> </personas> - garci
你能否将Xml文件加载到内存中并解析出任何错误信息?即将和号(&)转换为适当的转义序列? - Der Kommissar
我只能通过 Visual C# 修改文档。 - garci
1个回答

3

正如@EBrown所建议的,一种可能的方法是将文件内容读入字符串变量中,并将&符号替换为正确的属性XML表示形式&amp;,然后解析XML结构。一个可能的解决方案如下:

var xmlContent = File.ReadAllText(@"nuevo.xml");
XmlDocument doc;
doc = new XmlDocument();
doc.LoadXml(xmlContent.Replace("&", "&amp;"));

XmlNodeList Xpersonas = doc.GetElementsByTagName("personas");
XmlNodeList Xlista = ((XmlElement)Xpersonas[0]).GetElementsByTagName("edad");

foreach (XmlElement nodo in Xlista)
{
    string edad = nodo.GetAttribute("edad");
    string nombre = nodo.InnerText;
    Console.WriteLine(nodo.InnerXml.Replace("&amp;", "&"));
}

输出结果为:
34 & 34 

如果可以使用LINQ2XML,那么解决方案会更简短,并且无需编写反转(second)替换,因为LINQ2XML会自动为您完成此操作:
var xmlContent = File.ReadAllText(@"nuevo.xml");
var xmlDocument = XDocument.Parse(xmlContent.Replace("&", "&amp;"));
var edad = xmlDocument.Root.Element("edad").Value;
Console.WriteLine(edad);

输出结果与上面相同。

1
作为一个纯粹主义者,我必须警告不要使用转义符(&amp)来替换所有的和号(&):谁知道XML中的和号是否已经被转义了,或者更糟糕的是:误转义了其他字符。 - Der Kommissar
Visual C# 告诉我“文件不存在”,我该怎么办? - garci
@EBrown:我同意。在这种情况下,唯一的解决方案可能是使用自定义XML解析器,这可能是一项繁琐的任务。 - keenthinker
@garci:根据你的问题,我已经更新了答案中的代码。 - keenthinker
1
@garci 你应该在.cs文件的顶部添加using System.IO;。如果你对Visual Studio、C#或.NET的基本理解不够,无法做出这个决定,我建议你阅读一些相关教程:https://msdn.microsoft.com/zh-cn/library/aa288436(v=vs.71).aspx - Der Kommissar
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接