来自catch方法的调用方法不起作用

时间:2014-10-17 05:21:31

标签: c# .net xml exception

我正在尝试从catch块调用方法,但方法中的xmlnode似乎不起作用。我得到了一个空。如果我从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>

谢谢。

5 个答案:

答案 0 :(得分:1)

您的xml包含&amp; 字符,该字符不是有效的&#39; xml字符,必须转义。

<CategoryName>ARABIC & SONGS</CategoryName>

因此导致您的Load()方法抛出异常。

你应该做的是在将xml字符串中的所有无效字符传递给xml解析器之前将其转义为

yourXmlString = XmlConvert.EncodeName(yourXmlString);

然后您可以将yourXmlString传递给解析器,如此

var xDoc = XDocument.Parse(yourXmlString);

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

请注意,XmlDocumentXmlDocument类不是一回事,并且有一些显着差异。方法XDocument,如果我没记错的话,是Parse()优于XDocument的优势之一。

编辑:

您可以使用File类

将xml文件读入字符串
XmlDocument

答案 1 :(得分:0)

XmlDocument是一个引用类型......不需要用ref传递它。

而我的猜测是它首先没有加载,所以doc真的是空的

答案 2 :(得分:0)

看起来这个文档缺少xml声明标记。

尝试:

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

答案 3 :(得分:0)

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

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

对于此特定 XML,您只需将&替换为其编码版本&amp;即可生成有效的XML字符串:

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

相关问题供参考:Reading XML with an "&" into C# XMLDocument Object

答案 4 :(得分:0)

这将是我的解决方案:

    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;
    }