【问题标题】:validate xml string content including encoding using C#使用 C# 验证 xml 字符串内容,包括编码
【发布时间】:2011-05-27 21:42:56
【问题描述】:

我需要验证一个包含 XML 数据的字符串,不需要模式验证。我需要做的就是确保 XML 格式正确且编码正确。例如,我希望我的代码将 XML 的这个 sn-p 标识为无效:

<?xml version="1.0" encoding="utf-8"?>
<parentNode> Positions1 ’</parentNode>

使用XMLDocument中的LoadXML方法不起作用,我在上面加载sn-p时没有抛出错误。

如果内容在 XML 文件中,我知道如何执行此操作,以下代码 sn-p 显示:

XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.ConformanceLevel = ConformanceLevel.Document;
readerSettings.CheckCharacters = true;
readerSettings.ValidationType = ValidationType.None;

xmlReader = XmlReader.Create(xmlFileName, readerSettings);
XmlDocument xdoc = new XmlDocument();
xdoc.Load(xmlReader);

除了创建一个临时文件来写出我的 xml 字符串内容,然后创建一个 XmlReader 实例来读取它,还有其他选择吗?如果有人能指导我解决这个问题的正确方向,不胜感激。

【问题讨论】:

  • sn-p 没有什么无效的,我只是在寻找将 xml 数据写入临时文件的替代方法。

标签: c# xml validation encoding xmldocument


【解决方案1】:

您还没有完全理解编码的含义。如果您在内存中有一个 .Net 字符串,则它不再是“原始数据”并且因此没有编码。所以 LoadXML 是有充分理由的。所以你想做的事情根本没有多大意义。但如果你真的想这样做:

您可以将字符串转换为内存流,因此您不必编写临时文件。然后,您可以在调用 XmlReader.Create 时使用该流而不是 xmlFileName。

【讨论】:

  • 我确实怀疑 LoadXML 不知道编码,主要是因为它可能旨在加载 xml 片段。关于我为什么需要这样做的更多背景信息 - 我们接受通过 Web 服务上传到网站的 XML 文件,需要验证这些 XML 数据。执行以下步骤是否有意义:
  • 执行以下步骤有意义:1)通过使用正则表达式查看数据来找出 xml 数据的编码,2)使用 system.text.encoding.[encodingType] 读取字节.GetBytes,3) 将字节写入内存流和 4) 在对 XmlReader.Create 的调用中使用内存流。我有点束手无策,因为系统中有许多部分使用给定 XML 数据的 XMLDocument 表示,我正在寻找一种最有效的方法来验证数据而不破坏所有其他功能。
  • 您必须了解字符串的二进制表示和字符串的抽象概念之间的区别。从用户的角度来看,.Net 字符串不再具有编码。这只是一个字符串。您想到的解码必须在较早的步骤中进行:HTTP 请求具有编码,您必须使用该编码来解码字符串。或者,您可以将请求流传递给 XDocument。一旦有了 .Net 字符串,解码通常就为时已晚。但在大多数情况下,.Net 应该已经为您处理了这个问题。 ;-)
【解决方案2】:

阿奇姆,

感谢您的详细回复,我终于想出了一个适合我需要的解决方案。它涉及从 'unicode' 字符串中抓取字节,然后将字节转换为 utf8 编码。

        try
        {
            byte[] xmlContentInBytes = new System.Text.UnicodeEncoding().GetBytes(xmlContent);

            System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding(false, true);
            utf8.GetChars(xmlContentInBytes);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return false;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 2018-03-09
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2019-02-15
    • 2010-09-17
    相关资源
    最近更新 更多