XElement.Parse由于无效的xml文本而中断。

25 浏览
0 Comments

XElement.Parse由于无效的xml文本而中断。

我有一个包含无效XML字符的字符串。在解析字符串之前,我该如何转义(或删除)无效的XML字符?

0
0 Comments

在使用XElement.Parse解析无效的xml文本时,可能会出现XElement.Parse中断的情况。造成这个问题的原因是无效的xml字符,解决方法是使用XmlConvert.IsXmlChar方法来移除无效的xml字符。该方法从.NET Framework 4开始添加,并且在Silverlight中也有提供。下面是一个小的示例:

void Main() {
    string content = "\v\f\0";
    Console.WriteLine(IsValidXmlString(content)); // False
    content = RemoveInvalidXmlChars(content);
    Console.WriteLine(IsValidXmlString(content)); // True
}
static string RemoveInvalidXmlChars(string text) {
    var validXmlChars = text.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray();
    return new string(validXmlChars);
}
static bool IsValidXmlString(string text) {
    try {
        XmlConvert.VerifyXmlChars(text);
        return true;
    } catch {
        return false;
    }
}

此外,如果想要转义无效的xml字符,可以使用XmlConvert.EncodeName方法。下面是一个小的示例:

void Main() {
    const string content = "\v\f\0";
    Console.WriteLine(IsValidXmlString(content)); // False
    string encoded = XmlConvert.EncodeName(content);
    Console.WriteLine(IsValidXmlString(encoded)); // True
    string decoded = XmlConvert.DecodeName(encoded);
    Console.WriteLine(content == decoded); // True
}
static bool IsValidXmlString(string text) {
    try {
        XmlConvert.VerifyXmlChars(text);
        return true;
    } catch {
        return false;
    }
}

需要注意的是,编码操作会产生一个长度大于或等于源字符串长度的字符串。如果将编码后的字符串存储在具有长度限制的数据库的字符串列中,并在应用程序中验证源字符串长度以适应数据列限制,这可能很重要。此外,XmlConvert.VerifyXmlChars如果参数包含无效字符,不会抛出异常,而是返回空字符串(如果所有包含的字符都是有效的,则返回参数本身)。可以尝试使用

return XmlConvert.VerifyXmlChars(text) != null

来判断是否包含无效字符。

此外,不要在字符串用于XML值时使用XmlConvert.EncodeName。XML名称的限制比XML值的限制更严格,名称编码将导致不必要的意外转义。

另外,如果解析大型XML文件,使用抛出异常并捕获异常的方法可能会影响性能。以上代码仅用于演示目的,以展示转换前后XML字符串的状态。在实际应用中,通常不需要验证。

0
0 Comments

在使用XElement.Parse解析XML文本时出现了错误。这个错误的原因是XML文本不合法。解决这个问题的方法是使用SecurityElement.Escape来转义XML文本中的特殊字符。

在给定的代码示例中,首先引入了System和System.Security命名空间。然后定义了一个名为Sample的类,其中包含了一个名为Main的静态方法。

在Main方法中,定义了一个字符串变量text,该变量包含了一些需要转义的特殊字符。然后使用SecurityElement.Escape方法对text进行转义,并将结果赋值给xmlText变量。

最后,通过Console.WriteLine方法将转义后的xmlText输出到控制台。

通过运行这段代码,可以看到转义后的结果是"Escape characters : < > & " '"。这个结果是正确的,因为在XML文本中,特殊字符需要使用相应的转义序列来表示。

如果在Java中需要类似的功能,可以使用StringEscapeUtils类来转义XML文本。该类位于org.apache.commons.lang3包中,可以通过引入相应的依赖来使用。

以下是在Java中使用StringEscapeUtils进行XML转义的示例代码:

import org.apache.commons.lang3.StringEscapeUtils;
public class Sample {
  public static void main(String[] args) {
    String text = "Escape characters : < > & \" '";
    String xmlText = StringEscapeUtils.escapeXml10(text);
    //output:
    //Escape characters : < > & " '
    System.out.println(xmlText);
  }
}

通过运行这段Java代码,可以得到与之前C#代码相同的结果:"Escape characters : < > & " '"。这证明了使用StringEscapeUtils.escapeXml10方法可以在Java中实现类似的功能。

0
0 Comments

问题的出现原因是因为使用XElement.Parse解析一个无效的xml文本导致的。解决方法是使用XmlDocument或者Html Agility Pack来处理这样的情况。

在写xml的时候,可以使用框架提供的类来创建xml,这样就不需要担心转义字符的问题。例如:Console.Write(new XElement("Data", "< > &")); 输出结果为<Data>&lt; &gt; &amp;</Data>。

如果需要读取一个格式有问题的xml文件,不要使用正则表达式,而是使用Html Agility Pack。这个库可以帮助处理格式有问题的xml文件。

另外,如果使用XmlElement,可以通过设置InnerText属性来正确处理转义字符。但是如果元素的内容包含无效字符(如退格符0x08、其他控制字符或代理代码点),仍然可能会遇到问题。

0