【问题标题】:Parsing XML Out of the Middle of a String从字符串的中间解析 XML
【发布时间】:2012-03-15 03:07:09
【问题描述】:

我正在使用 .NET,我想做一些这样的字符串操作:

输入:

hi hello <bbb name='ahhahdch'>MR.JKROY</bbb>.how are you.Let's meet
<bbb name='bbcbc'>SUSANNE</bbb>. Our team lead     is <bbb name='cdcdcd'>JACK</bbb>, from .net.

输出:

你好,JKROY 先生。你好吗。我们见面吧。我们的团队负责人是来自 .net 的 JACK。

简而言之,我想删除 XML 标记(包括属性)并检索标记的值。

【问题讨论】:

    标签: .net xml string c#-4.0 xml-parsing


    【解决方案1】:

    您没有有效的 XML 文档;如果您发现大部分(或全部)输入是这样的,您可以轻松地将内容包装在虚拟标签中以确保解析器不会失败(假设内部节点内容在另一个 XML 元素的内容时有效),例如所以:

    <root>
    hi hello <bbb name='ahhahdch'>MR.JKROY</bbb>.how are you.Let's meet
    <bbb name='bbcbc'>SUSANNE</bbb>. Our team lead     is <bbb name='cdcdcd'>JACK</bbb>, from .net.
    </root>
    

    一旦您拥有有效 XML 文档,您就可以使用XmlDocument class 解析内容,然后使用InnerText property 获取删除元素的文本:

    string xml = <content from above>;
    
    var doc = new XmlDocument();
    doc.LoadXml(xml);
    
    // Gives you only the text.
    Console.WriteLine(doc.InnerText);
    

    或者使用XDocument class,然后从XElement上的Value property获取文本,由Root property on XDocument暴露:

    XDocument doc = XDocument.Parse(xml);
    
    // Gives you only the text.
    Console.WriteLine(doc.Root.Value);
    

    【讨论】:

    • 这不起作用,因为在他的示例中这不是有效的 XML 文档。在这种情况下他需要一个移除算法
    • @Justin 我已经更新了我的答案以反映这一点;这是一个简单的修复,只需将内容包装在虚拟标签中以确保解析成功。
    • 它仍然无法工作,因为在整个字符串的随机位置有纯文本。在这种情况下,Tats 建议的正则表达式是最干净的解决方案。
    • @Justin 随机文本很好,示例字符串中的所有内容,如果包含在一组标签中,就是有效的 XML 文档。
    • @Justin 如果内容被包装在一组标签中,字符串的哪些部分会给 XML 解析器带来问题?
    【解决方案2】:

    hiya 如果它的 HTML 标记只被删除然后使用这个

    string result = Regex.Replace(htmlText, @"<(.|\n)*?>", string.Empty);
    

    如果您正在获取 XML 提要,并且您可以使用 LINQ 在此处创建字符串很好的回答:remove tags from a xml file written to a string?

    How can I strip HTML tags from a string in ASP.NET?

    干杯

    【讨论】:

    • 解析 XML 或 HTML 与常规 expeessions 是您可以采取的最糟糕的方法之一,因为可靠的解析器很流行。当解决方案在框架中(XML 的 XDocument 和 XmlDocument)或容易获得(HTML 的 HtmlAgilityPack 通过 NuGet)时,这是不值得的麻烦。
    • Hiya Casper - 是的 - 但在这种情况下,他的文件中似乎只有 1(一)行;是的,我同意正则表达式对性能的影响,将删除我的答案伙伴。同样,此解决方案是一个牛仔解决方案,用于处理不解析整个 HTML 标记文件的一行。干杯。
    • 您不必删除您的答案,只是有效 XML 的正则表达式实际上与性能无关,而更多的是关于使所有有效的 XML 标记表示正确。 It's trickier than you think
    • @casperOne +1 为链接伙伴!传奇!
    【解决方案3】:

    使用 HTML Agility 包http://htmlagilitypack.codeplex.com/ 可以使这种事情变得更容易。您可以使用 XPath 语法去查询元素。

    您可以通过 nuget 获得它,但从 codeplex 站点下载的项目有一个将 html 转换为文本的实用程序类的示例。

    【讨论】:

    • 他要的是 XML,而不是 HTML。
    • 好吧,他没有有效的 XML 文档,所以考虑到他需要解析垃圾,我的建议是可靠的。此外,我在敏捷包中提到的示例仍然是解决他的问题的有用代码。
    猜你喜欢
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多