【问题标题】:Parsing XML with &lt; and &gt;使用 < 和 > 解析 XML
【发布时间】:2014-08-12 22:04:09
【问题描述】:

我试图剥离一些 XML 并仅获取与字段相关的值,但是 XML 不使用小于号和大于号。我尝试在字段名称周围添加子字符串(在下面的例子中是日期),这很好用。

    &lt;my:Date xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2014-07-27T23:04:34"&gt;2014-08-15&lt;/my:Date&gt;

但是,我无法围绕小于和大于子串。我的代码如下:

public string processReportXML(string field, string xml)
    {
        try
        {
            string result = xml.Substring(xml.IndexOf(field));
            int resultIndex = result.LastIndexOf(field);
            if (resultIndex != -1) result = result.Substring(0, resultIndex);

            result = result.Substring(result.IndexOf("&gt;"));
            resultIndex = result.IndexOf("&lt;");
            if (resultIndex != -1) result = result.Substring(0, resultIndex);

            return field + ": " + result.Substring(4) + "\n";
        }
        catch (Exception e)
        {
            return field + " failed\n";
        }
    }

我在一个测试项目中尝试过,它工作正常,但在我的实际 Web 服务中,我总是得到索引应该大于 0。我也尝试过使用正则表达式替换字符,但这也没有用。

result = Regex.Replace(result, "&(?!(amp|apos|quot|lt|gt);)", "hidoesthiswork?");

【问题讨论】:

    标签: c# xml regex


    【解决方案1】:

    您有 HTML 编码的数据。

    在方法的开头添加这个以获得简单的解决方案:

    xml = HttpUtility.HtmlDecode(xml);
    

    如果您使用 .NET 4.0+,也可以使用 WebUtility.HtmlDecode,如 this answer

    从长远来看,您确实应该使用 XML 解析器或类似 LINQ-XML 的东西来访问这些数据。正则表达式不适用于此类结构化数据。

    【讨论】:

    • 谢谢 :) 我现在应该可以得到标签之间的内文了吧?
    • 是的,您确实应该考虑使用 LINQ to XML 来做到这一点 :)
    • 好的,我会添加一个根节点以使其格式正确,对吗?然后循环遍历 HTML 并使每个元素成为一个新的 XElement?
    • 你不需要循环,你可以通过LINQ-SQL将它转换成一个集合。阅读它,它非常酷!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2019-03-15
    • 2013-02-27
    • 2017-03-16
    • 2015-06-26
    • 2016-12-11
    • 2013-02-20
    相关资源
    最近更新 更多