从catch方法调用方法不';不起作用

本文关键字:方法 不起作用 catch 调用 | 更新日期: 2023-09-27 18:26:47

我试图从catch块调用一个方法,但该方法中的xmlnode似乎不起作用。我得到一个null。如果我从try块调用相同的方法,它就会工作。

var doc = new XmlDocument();
try
{
 doc.Load(f.FullPath);
// do some work 
}
 catch (Exception e)
 {
  if (e is XMLException)
  {
   checkXML(ref doc);
  }
public void checkXML(ref XmlDocument doc)
            {
                XmlNode xn = doc.SelectSingleNode("/BroadcastMonitor/Current");
                xn["name1"].InnerText = SecurityElement.Escape(xn["name1"].InnerText);
                xn["name2"].InnerText = SecurityElement.Escape(xn["name2"].InnerText); ;

            }

现在,当catch块调用方法"checkXML"时,我得到的xn为null。但是,如果我从"try"块执行相同的操作只是为了检查,"xn"就有一个值无论何时调用try或从catch块调用,doc也有一个值。

为什么会发生这种情况?请帮我理解。

编辑

<BroadcastMonitor>
<updated>2014-10-17T07:56:30</updated>
<Name>TESTING</Name>
<Current>
    <artistName>اصاله&  نصرى</artistName>
    <albumName>شخصيه عنيده</albumName>
    <CategoryName>ARABIC & SONGS</CategoryName>
</Current>
</BroadcastMonitor>

谢谢。

从catch方法调用方法不';不起作用

您的xml包含一个&字符,该字符不是"有效"xml字符,必须转义。

<CategoryName>ARABIC & SONGS</CategoryName>

因此,它导致Load()方法抛出异常。

您应该做的是先转义xml字符串中的所有无效字符,然后再将它们传递给类似的xml解析器

yourXmlString = XmlConvert.EncodeName(yourXmlString);

然后,您可以像一样将XmlString传递给解析器

var xDoc = XDocument.Parse(yourXmlString);

或者,如果您不想或不能使用XDocument类,则需要确保保存已编码的xml,以便XmlDocument类的Load()方法读取已正确编码的文件。

注意,XmlDocumentXDocument类不是一回事,并且有一些显著的差异。方法Parse(),如果我没记错的话,是XDocument相对于XmlDocument的优点之一。

编辑:

您可以使用file类将xml文件读取为字符串

var yourXmlString = File.ReadAllText(filePath);
XmlDocument是一个引用类型。。。无需通过参考

我的猜测是,它首先无法加载,所以doc实际上是空的

此文档似乎缺少xml声明标记。

尝试:

XmlDocument doc = new XmlDocument;
using(StreamReader reader = new StreamReader(f.FullPath))
{
    doc.LoadXml(reader.ReadToEnd());
}

您可以使用System.IO.File.ReadAllText()将文件中的所有文本获取到字符串变量中:

string invalidXml = System.IO.File.ReadAllText(f.FullPath);

对于这个特定的XML,您可以简单地将&替换为其编码版本&amp;,以生成有效的XML字符串:

string validXml = invalidXml.Replace("&", "&amp;");
doc.LoadXml(validXml);
.....

可供参考的相关问题:用"&quot;转换为C#XMLDocument对象

这将是我的解决方案:

    private static Regex InnerValues = new Regex(@"(?<=<(.*?>)).*?(?=</'1)",RegexOptions.Compiled);
    private static XmlDocument LoadInvalidDocument(string path)
    {
        XmlDocument result = new XmlDocument();
        string content = File.ReadAllText(path);
        var matches = InnerValues.Matches(content);
        foreach (Match match in matches)
        {
            content = content.Replace(match.Value,  HttpUtility.HtmlEncode(match.Value));
        }
        result.LoadXml(content);
        return result;
    }