c# - 查找 xml 中所有不是标签的 'more or less than' 字符

标签 c# xml regex

我需要一个正则表达式来查找所有不是 xml 标签的“<”或“>”。

例子:

<tag1>W<E><E</tag1>Z<>S

应该找到

<><<>

例子:

<tag1>W<E><E</E></tag1>Z<>S

应该找到

<<>

因此,任何“<”或“>”不在标签中的点击(是的,我们也有应该考虑的自动关闭标签:)

编辑#2: 最后我想做的是用 html 编码的值替换所有匹配项。

编辑#3:

所以我想做的是从包含 HTML 和一些附加标签(很少有已知标签)的文本中获取标签中未包含的所有“<”和“>”。

示例(我想找到粗体,以便我可以用它们的编码值替换它们):

<div>
  <a href="link">Link with < characters</a>
  <knownTag>Text with character ></knownTag>
  <knownTag>Text < again ></knownTag>
<div>

结果应该是:

<div>
  <a href="link">Link with &lt; characters</a>
  <knownTag>Text with character &gt;</knownTag>
  <knownTag>Text &lt; again &gt;</knownTag>
<div>

关于如何解决这个问题有什么想法吗?

最佳答案

这可以用正则表达式来完成;但是,它并不像您建议的那么简单。您将需要找到有效的标签并对其进行处理才能完成这项工作。碰巧我前段时间在编写一个快速轻便的 xml/html 解析器时这样做了。该代码位于:

http://csharptest.net/browse/src/Library/Html/XmlLightParser.cs http://csharptest.net/browse/src/Library/Html/XmlLightInterfaces.cs

要使用解析器,您将从两个源文件中的后者实现定义的接口(interface) IXmlLightReader。以下示例产生了您想要的结果,并且还处理了您未提及的其他几种功能,例如 CDATA 部分、处理指令、DTD 等。

class RegexForBadXml
{
    const string Input = "<?xml version=\"1.0\"?>\r\n<div>\r\n\t<a href=\"link\">Link with < characters</a>\r\n\t<knownTag>Text with character > &and other &#BAD; stuff</knownTag>\r\n\t<knownTag>Text < again ></knownTag>\r\n\t<knownTag><![CDATA[ Text < again > ]]></knownTag>\r\n<div>";

    private static void Main()
    {
        var output = new StringWriter();
        XmlLightParser.Parse(Input, XmlLightParser.AttributeFormat.Html, new OutputFormatter(output));
        Console.WriteLine(output.ToString());
    }

    private class OutputFormatter : IXmlLightReader
    {
        private readonly TextWriter _output;
        public OutputFormatter(TextWriter output)
        {
            _output = output;
        }

        void IXmlLightReader.StartDocument() { }
        void IXmlLightReader.EndDocument() { }

        public void StartTag(XmlTagInfo tag)
        {
            _output.Write(tag.UnparsedTag);
        }

        public void EndTag(XmlTagInfo tag)
        {
            _output.Write(tag.UnparsedTag);
        }

        public void AddText(string content)
        {
            _output.Write(HttpUtility.HtmlEncode(HttpUtility.HtmlDecode(content)));
        }

        public void AddComment(string comment)
        {
            _output.Write(comment);
        }

        public void AddCData(string cdata)
        {
            _output.Write(cdata);
        }

        public void AddControl(string cdata)
        {
            _output.Write(cdata);
        }

        public void AddInstruction(string instruction)
        {
            _output.Write(instruction);
        }
    }
}

前面的程序输出如下结果:

<?xml version="1.0"?>
<div>
    <a href="link">Link with &lt; characters</a>
    <knownTag>Text with character &gt; &amp;and other &amp;BAD; stuff</knownTag>
    <knownTag>Text &lt; again &gt;</knownTag>
    <knownTag><![CDATA[ Text < again > ]]></knownTag>
<div>

注意:我添加了 xml 声明、CDATA 和“&”文本,仅用于测试。

关于c# - 查找 xml 中所有不是标签的 'more or less than' 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17012223/

相关文章:

c# - jQuery:在 jquery ajax json 调用中返回字符串响应

c# - 如何禁用整个系统的空气震动?

java - jackson fastxml 将命名空间添加到根元素

regex - 如何创作和管理很长的正则表达式模式并重用模式 block ?

c# - 从公式字符串中解析出 Excel 函数

c# - 如何在没有 "new' ing"类实例并自己提供参数的情况下进行依赖注入(inject)?

c# - 在 GROUP BY MySQL 查询上读取 IDataReader

XML 瓮 :# is not a valid value for anyURI

javascript - jQuery.find().each(fn) 在 Firefox 中不起作用

javascript - 用于删除行尾空格模式的正则表达式