【问题标题】:Help to review whether my XML validation code is efficient帮助检查我的 XML 验证代码是否高效
【发布时间】:2009-06-21 16:01:35
【问题描述】:

我正在检查特定输入字符串在 XML UTF-8 编码中是否有效(可用作 XML 元素的值)。我的目标是根据 XML UTF-8 编码标准判断哪个字符串(来自输入字符串数组)无效。

这是我的代码,我当前的实现很简单——用输入字符串数组中的每个单独的字符串组装 XML 文件。我不确定这是否是最有效的方法。从功能的角度来看,它是有效的。

我的工作环境是 .Net 3.5 + VSTS 2008 + C#。

    static void Main(string[] args)
    {
        string[] inputs = { "Hello", "World", "StackOverflow", "ServerFault", "&#DFFE" };
        XmlDocument xDoc = new XmlDocument();
        string header = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
        string formatter = "<foo>{0}</foo>";
        foreach (string item in inputs)
        {
            StringBuilder builder = new StringBuilder();
            builder.Append (header);
            builder.Append (String.Format(formatter, item));
            try
            {
                xDoc.Load(new StringReader(builder.ToString()));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }

提前致谢, 乔治

【问题讨论】:

    标签: c# .net xml visual-studio-2008 encoding


    【解决方案1】:

    George,在编写测试时,最好从演示失败案例的测试开始。

    您的代码会失败吗?我不这么认为。

    您应该从与您想要创建此测试的问题相近的测试开始。我想您遇到了 XML 文件未正确编码的问题?在这种情况下,您应该创建一个测试来证明坏文件是坏的(您已经知道这是真的),然后概括测试,以便它可以检测到其他坏文件是坏的,并且所有好的文件都是好的.

    【讨论】:

    • 嗨约翰,我知道什么样的输入是无效的,我的问题不是关于如何测试,而是我当前的直接实现是否逐个检查字符串(以构造 XML 文件的方式) 是否足够高效,以及是否有更好的方法来检查更有效?让我知道是否有任何误解。我问的不是功能,而是性能。
    • “你的代码会失败吗?我不这么认为。” -- 当有无效输入时,我的代码将失败,例如 xxx,当 xxxx 不在 XML 的有效范围内时。 en.wikipedia.org/wiki/XML
    • 指维基百科页面的“数字字符引用”部分。
    • 乔治,如果有失败案例,那么也许您应该编辑您的问题以包含其中一个,而不是显示成功案例列表?
    • @John,我添加了无效的测试用例,您可以测试它是否会导致异常。现在轮到我了,:-) 关于如何提高验证性能的任何建议?
    【解决方案2】:

    你可以这样做:

        public static XmlElement xmlValidationElement =
            new XmlDocument().CreateElement("validator");
    
        static void Main(string[] args)
        {
            string[] inputs = { "Hello", "World", "StackOverflow", "ServerFault" };
            foreach (string item in inputs)
            {
                try
                {
                    xmlValidationElement.InnerXml = item;
                }
                catch (XmlException ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
        }
    

    【讨论】:

    • 是的,因为我的代码中涉及的唯一步骤是实际的内置验证。没有 StringBuilder、没有 StringReader、一个 XmlDocument 和一个没有 xml 解析的 XmlElement。您可以运行一些测试来查看实际差异;)
    猜你喜欢
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多