【问题标题】:Calling method from catch method doesn't work从 catch 方法调用方法不起作用
【发布时间】:2014-10-17 05:21:31
【问题描述】:

我正在尝试从 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”有一个值。 'doc' 也有一个值,无论何时调用 try 或从 catch 块调用。

为什么会这样?请帮我理解。

编辑

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

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

</Current>
</BroadcastMonitor>

谢谢。

【问题讨论】:

  • 您是否尝试过调试您的程序并逐步检查您的代码以查看异常代码块中doc 变量的内容是什么?
  • 是的,我已经做到了,正如我的问题中提到的那样。 doc变量有值
  • 您的代码在doc.Load(...)do some work 是否失败(=引发异常)?
  • 尝试使用最小 XML 结构的代码。如果它仍然不起作用(所以问题可能不是 xml 不正确),请将 xml 代码也粘贴到您的问题中。
  • @pasty:好的,当它尝试加载并且存在转义实体或者它会给我一个 xmlException 的东西时发现问题,在这种情况下加载不完整并且元素丢失。感谢您的指点。+1。

标签: c# .net xml exception


【解决方案1】:

您的 xml 包含一个 & 字符,该字符不是“有效”的 xml 字符,必须进行转义。

<CategoryName>ARABIC & SONGS</CategoryName>

所以它会导致你的 Load() 方法抛出异常。

您应该做的是在将 xml 字符串中的所有无效字符传递给这样的 xml 解析器之前转义它们

yourXmlString = XmlConvert.EncodeName(yourXmlString);

然后您可以像这样将 yourXmlString 传递给解析器

var xDoc = XDocument.Parse(yourXmlString);

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

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

编辑:

您可以使用 File 类将 xml 文件读入字符串

var yourXmlString = File.ReadAllText(filePath);

【讨论】:

  • 嗨,亚历克斯,+1 了解详细说明。你的解决方案看起来不错。但是如何使用流式阅读器或其他工具将我的 xmlfile 放入您的xmlstring。
【解决方案2】:

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

我的猜测是它一开始就无法加载,所以 doc 真的是 null

【讨论】:

  • 是的,它是空的,目前正试图找出一种方法来读取 xml 并修复转义字符。你有这方面的线索吗
  • 你能粘贴一个例子吗?
【解决方案3】:

此文档似乎缺少其 xml 声明标记。

尝试:

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

【讨论】:

  • xml声明在那里,只是我这里没有添加。错误在 中,请查看 & 符号。这在 XML 中是非法的。我只想阅读整个 xml 并修复转义的实体。
  • 好吧,我会通过修复这些文档的编写(到有效的 xml)来解决它。否则你需要像正则表达式替换这样的东西,这是一些任务......
  • 这是一个软件正在编写的文档,我联系了该软件的支持,他们说这个软件已经很老了,他们不会再花时间修复它的错误了。所以对我来说,剩下的唯一事情就是自己以编程方式修复它
  • 任何关于正则表达式的线索将不胜感激
  • 这并不难...我只需要一些时间来弄清楚...我们只需要找到所有内部节点值并在 em 上调用 html.encode...我目前不在我的电脑虽然
【解决方案4】:

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

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

对于这个特定 XML,您可以简单地将&amp;amp; 替换为它的编码版本&amp;amp; 以生成有效的XML 字符串:

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

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

【讨论】:

    【解决方案5】:

    这将是我的解决方案:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 2017-12-31
      • 2019-07-08
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多