从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>
谢谢。
您的xml包含一个&字符,该字符不是"有效"xml字符,必须转义。
<CategoryName>ARABIC & SONGS</CategoryName>
因此,它导致Load()
方法抛出异常。
您应该做的是先转义xml字符串中的所有无效字符,然后再将它们传递给类似的xml解析器
yourXmlString = XmlConvert.EncodeName(yourXmlString);
然后,您可以像一样将XmlString传递给解析器
var xDoc = XDocument.Parse(yourXmlString);
或者,如果您不想或不能使用XDocument
类,则需要确保保存已编码的xml,以便XmlDocument
类的Load()
方法读取已正确编码的文件。
注意,XmlDocument
和XDocument
类不是一回事,并且有一些显著的差异。方法Parse()
,如果我没记错的话,是XDocument
相对于XmlDocument
的优点之一。
编辑:
您可以使用file类将xml文件读取为字符串
var yourXmlString = File.ReadAllText(filePath);
我的猜测是,它首先无法加载,所以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,您可以简单地将&
替换为其编码版本&
,以生成有效的XML字符串:
string validXml = invalidXml.Replace("&", "&");
doc.LoadXml(validXml);
.....
可供参考的相关问题:用"";转换为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;
}