2014-10-17 59 views
-1

我想从一个catch块调用一个方法,但该方法内部的xmlnode似乎不起作用。我得到一个null。如果我从try块中调用同样的方法,它就可以工作。从catch方法调用方法不起作用

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为空。但是如果我只是为了检查而从'try'块执行相同的操作,'xn'就有一个值。 'doc'也有一个值,无论何时调用try或from catch块。

这是怎么发生的?请帮助我理解。

编辑

<BroadcastMonitor> 
<updated>2014-10-17T07:56:30</updated> 
<Name>TESTING</Name> 
<Current> 

    <artistName>اصاله& نصرى</artistName> 
    <albumName>شخصيه عنيده</albumName> 
    <CategoryName>ARABIC & SONGS</CategoryName> 

</Current> 
</BroadcastMonitor> 

谢谢。

+2

您是否尝试过调试程序并通过代码逐步查看'doc'变量的内容在异常代码块中的内容? – pasty 2014-10-17 05:26:35

+0

是的,我已经这样做了,正如我的问题所述。 doc变量的值为 – user726720 2014-10-17 05:28:42

+0

你的代码在'doc.Load(...)'或'做了些什么工作'失败(=引发异常)? – pasty 2014-10-17 05:30:02

回答

1

你的XML包含&特点,它已不是一个 '有效' 的XML字符必须进行转义。

<CategoryName>ARABIC & SONGS</CategoryName> 

所以这是造成你的Load()方法抛出异常。

你应该做的是将它们传递到XML解析器,像这样

yourXmlString = XmlConvert.EncodeName(yourXmlString); 

之前逃脱在你的XML字符串中的所有无效字符,那么您可以通过yourXmlString到解析器像这样

var xDoc = XDocument.Parse(yourXmlString); 

,或者如果你不想或者不能使用XDocument类,你需要确保你保存编码的XML,以便XmlDocument类的Load()方法将被读取的文件是正确的编码。

请注意,XmlDocumentXDocument类是不同的东西,并有一些显着的差异。方法Parse(),如果我没有记错的话,XDocument的优势之一就是XmlDocument

编辑:

您可以使用File类

var yourXmlString = File.ReadAllText(filePath); 
+0

嘿亚历克斯,+1的详细说明。你的解决方案看起来不错但是,如何使用streamreader或其他方法将xmlfile放入yourxmlstring中。 – user726720 2014-10-17 11:50:21

+0

是的。检查我的编辑。 – Alex 2014-10-17 13:17:15

0

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

我的猜测是,它未能在第一时间加载这样的文档实在是空

+0

是的,它是空的,试图找出如何阅读XML并修复转义字符的方法。你对这个 – user726720 2014-10-17 09:48:20

+0

有任何线索可以粘贴一个例子吗? – 2014-10-17 10:02:26

+0

或将HttpUtility.HtmlDecode窍门 – 2014-10-17 10:04:31

0

它看起来是这样的文件丢失它的XML声明标记。

尝试:

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

xml声明存在,这只是我没有在这里添加它。错误出现在中,查看&sign。这在XML中是非法的。我只想读取整个XML并修复转义的实体。 – user726720 2014-10-17 11:15:19

+0

嗯,我会通过修复这些文档的写入来处理它(以有效的XML)。否则你会需要像正则表达式替换,这是一些任务... – 2014-10-17 11:20:36

+0

这是文件正在写一个软件,我接近了软件的支持,他们说这个软件是相当老,他们不会花时间在修复它的错误了。所以对我来说,剩下的唯一事情就是以编程的方式修复它 – user726720 2014-10-17 11:34:46

0

读取XML文件转换成字符串,您可以使用System.IO.File.ReadAllText()获得从文件中的所有文本字符串变量:

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

对于这个特别是 XML,你可以简单地repl王牌&与它的编码版本&amp;做出有效的XML字符串:

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

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

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