我正在尝试从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>
谢谢。
答案 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}}类将读取正确编码的文件。
请注意,XmlDocument
和XmlDocument
类不是一回事,并且有一些显着差异。方法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,您只需将&
替换为其编码版本&
即可生成有效的XML字符串:
string validXml = invalidXml.Replace("&", "&");
doc.LoadXml(validXml);
.....
答案 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;
}