2014-10-17 72 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; 
    }