jjzjj

c# - 将 XHTML5 解析为 XDocument

coder 2024-06-28 原文

我需要将 XHTML5 文件解析为 XDocument实例。我的文件总是格式正确的 XML,所以我想避免 HtmlAgilityPack由于它对格式错误的 XHTML 的宽容。 XDocument.Load方法适用于简单的情况,但当文档包含命名字符引用(实体)时会中断:

var xhtml = XDocument.Load(reader);
// XmlException: Reference to undeclared entity 'nbsp'. 

对于 XHTML 1.0,这个问题可以通过使用 XmlPreloadedResolver 来解决。 ,它预加载了 XHTML 1.0 中定义的众所周知的 DTD。该方法可以通过手动提供其 DTD 来扩展以支持 XHTML 1.1,如 this answer 所示。 .

然而,XHTML5 没有 DTD,正如 this other answer 中所讨论的那样.其实体定义仅供引用as JSON .

<!DOCTYPE html>

因此,XmlResolver在 XHTML5 中解析实体时永远不会调用方法。有关于 providing XmlReader with a list of entity declarations 尝试的讨论,但似乎没有一种方法是开箱即用的。

目前,我正在研究两种方法。第一个是在文档类型声明中指定带有实体声明的内部子集,或者通过对源 XHTML 的字符串操作,或者通过 XmlParserContext.InternalSubset。 .这将导致类似于以下的文档类型声明:

<!DOCTYPE html [
  <!ENTITY ndash "&#8211;">
  <!ENTITY nbsp "&#160;">
  ...
]>

好像是这样is allowed在 XHTML5 中;然而,这是不可取的,因为它乱丢了 XDocument与实体声明(现在有 more than 2000 ),如果用户将其转换回字符串表示形式,这将是有问题的。

我的另一种方法是使用正则表达式预处理 XHTML 字符串,将所有命名字符引用转换为数字字符引用(或转换为实际的 Unicode 字符),不包括 XML 预定义实体," & ' < > .但是,我担心这种方法可能会遗漏 XML 定义中的复杂性。例如,this answer指示不得在注释、CDATA 部分或处理指令中转义字符。我假设需要调整我的正则表达式以排除所有这些事件。

是否有人对这两种方法或您会考虑的任何其他方法有经验或建议?我更喜欢基于 XmlReader 的方法的可扩展性,但如果没有其他方法,将求助于源字符串操作。

最佳答案

如果您将身份转换应用于带有实体映射的源文档,它将在结果中替换为您的实际字符。对我来说,这与正则表达式没有什么不同(一步),当然也没有那么复杂。

鉴于此来源:

<!DOCTYPE foo [
 <!ENTITY ndash "&#8211;">
 <!ENTITY nbsp "&#160;">
]>
<foo>
  <p>I am &ndash; and I am&nbsp;non-breaking space.</p>
</foo>

这个转换:

        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>

你会得到这个结果作为你的新输入:

<foo>
   <p>I am – and I am non-breaking space.</p>
</foo>

此外,您可以将所有这些定义保存在一个单独的文件中,并像这样添加一个对它们的引用:

<!ENTITY % winansi SYSTEM "path/to/my/map/winansi.xml">  %winansi;]>

关于c# - 将 XHTML5 解析为 XDocument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35520594/

有关c# - 将 XHTML5 解析为 XDocument的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  4. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  5. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  6. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  9. ruby - 如何使用 Nokogiri 解析纯 HTML 表格? - 2

    我想用Nokogiri解析HTML页面。页面的一部分有一个表,它没有使用任何特定的ID。是否可以提取如下内容:Today,3,455,34Today,1,1300,3664Today,10,100000,3444,Yesterday,3454,5656,3Yesterday,3545,1000,10Yesterday,3411,36223,15来自这个HTML:TodayYesterdayQntySizeLengthLengthSizeQnty345534345456563113003664354510001010100000344434113622315

  10. python - 帮我找到合适的 ruby​​/python 解析器生成器 - 2

    我使用的第一个解析器生成器是Parse::RecDescent,它的指南/教程很棒,但它最有用的功能是它的调试工具,特别是tracing功能(通过将$RD_TRACE设置为1来激活)。我正在寻找可以帮助您调试其规则的解析器生成器。问题是,它必须用python或ruby​​编写,并且具有详细模式/跟踪模式或非常有用的调试技术。有人知道这样的解析器生成器吗?编辑:当我说调试时,我并不是指调试python或ruby​​。我指的是调试解析器生成器,查看它在每一步都在做什么,查看它正在读取的每个字符,它试图匹配的规则。希望你明白这一点。赏金编辑:要赢得赏金,请展示一个解析器生成器框架,并说明它的

随机推荐