jjzjj

html - HTML,XMLNS, namespace ,XML

coder 2024-07-03 原文

我在用nekohtml+dom4j解析html文档时遇到了一些问题。
我发现我的xpath表达式不再工作了,因为最近在html源代码中添加了一个新的默认html xml名称空间。
规格说明:
前缀xmlns仅用于
声明命名空间绑定并由
绑定到命名空间名称的定义
http://www.w3.org/2000/xmlns/它必须
不申报。其他前缀必须
未绑定到此命名空间名称,
它不能被宣布为
默认命名空间。元素名必须
没有前缀xmlns。
但在我的html文档中,最近(我猜)在html标记中添加了:xmlns=“http://www.w3.org/1999/xhtml”
我找到了两个解决方案:
1)删除命名空间:

DOMParser parser = new DOMParser();
parser.setFeature("http://xml.org/sax/features/namespaces", false);
parser.parse(url);

根据nekohtml faq所说。
2)在我的xpath中添加一个前缀,绑定到默认的html名称空间。
(似乎它无法将前缀“空字符串”绑定到我想要的命名空间)
Map<String,String> XPATH_NAMESPACES = new HashMap<String, String>();
XPATH_NAMESPACES.put("my_prefix", "http://www.w3.org/1999/xhtml");

XPath xpath = document.createXPath(xpathExpr);
xpath.setNamespaceURIs(XPATH_NAMESPACES);
Element element = (Element) xpath.selectSingleNode(document);

然后,不使用//td作为示例,而是使用//my_前缀:td
我只是发布这些解决方案,因为有些人会觉得这个帖子很有用。
另见http://www.edankert.com/defaultnamespaces.html#Jaxen_and_Dom4J
但我真正想知道的是:
为什么使用不同的命名空间
默认的那个?
为什么会有人从http://www.w3.org/2000/xmlns/切换到
http://www.w3.org/1999/xhtml
为什么我们通常使用w3名称空间?命名空间是否有
对浏览器的影响?
我想我的问题对你们中的一些人来说是显而易见的,但我并没有真正明白它带来了什么。
我读过html和xhtml之间的区别。我想使用xhtml dtd的人更愿意使用这个名称空间,但是除了给爬虫程序或其他类似的东西带来额外的痛苦之外,真正的兴趣是什么?
ps:我已经看到,要从html传递到xhtml,必须同时添加xmlns和xml:lang,例如:
所以这可能不是我正在解析的网站的目标,因为没有添加xml:lang…
谢谢

最佳答案

在您的问题中显然有很多混淆,如果不编写一个完整的XML名称空间教程,很难解决这个问题。我会尽我所能地试着把它们与(x)html联系起来。
首先,名称空间的目的是分离词汇表。因此,例如,当title命名空间中的http://www.w3.org/1999/xhtml元素出现在同一文档中或由公共处理器处理时,可以将其与title命名空间中的http://www.w3.org/2000/svg元素区分开来。
第二,忘记http://www.w3.org/2000/xmlns/名称空间。它的作用很大程度上是在幕后,你很少需要担心它。
接下来,我们需要区分空命名空间、默认命名空间和前缀引用的命名空间。
当XML文件没有定义xmlns=属性时,所有未固定的元素都被称为“在空命名空间中”,或者“在没有命名空间中”,这等于相同的东西。
当一个xml元素有一个xmlns=属性时,它和它的子元素(如果它们是不固定的)被称为“在默认名称空间中”,其中默认名称空间是xmlns属性的值。
前缀元素始终位于由元素或元素祖先中的xmlns:prefix=属性映射的命名空间中。
现在,xhtml词汇表被定义为http://www.w3.org/1999/xhtml命名空间中的元素,因此正确编写的xhtml文档将声明该命名空间为默认命名空间,或者将前缀映射到命名空间,在这种情况下,所有xhtml元素都需要在其名称中包含该前缀。(后一种情况并不经常发生,原因如下)。
因此,当使用xml解析器解析xhtml时,需要有名称空间映射。
但是,xpath没有默认名称空间的概念。如果不在xpath中命名的元素上加前缀,它将尝试匹配空命名空间中的元素。如果xhtml元素在http://www.w3.org/1999/xhtml命名空间中,那么xpath将不匹配任何内容。
这就是它开始变得复杂的地方-浏览器。
如果您按照您应该的方式向浏览器提供xhtml网页,使用application/xhtml+xml这样的xml内容类型,浏览器将使用xml解析器来加载它,并应用所有上述规则。如果不包含xmlns="http://www.w3.org/1999/xhtml"属性,浏览器将不了解如何处理它,而只是将文件显示为原始xml结构。
然而,因为IE9之前的IE不支持XML内容类型,所以很少有人会这样为他们的网页服务。相反,它们使用“text/html”内容类型,在这种情况下,浏览器根本不使用xml解析器,而是使用html解析器。
html解析器只是忽略名称空间到前缀的映射,而只是“知道”哪些元素名称属于哪个名称空间。这使得它最终不那么灵活,但在其专门领域内,更加健壮和易于使用。(在上面的title元素示例中,它通过查看title的祖先元素来确定应用哪个名称空间)这就是xhtml文档不使用前缀元素的原因,因为html解析器无法识别它们。
浏览器(不管怎样是现代的浏览器)有专门的类似dom的api方法和css规则来隐藏javascript和css作者的所有名称空间复杂性,因此,在大多数情况下,web作者可以安全地忽略名称空间。
但是,独立的html解析器并不总是这样做。相反,它们将所有元素放在空名称空间中,这意味着可以使用xpath找到这些元素,xpath使用标准domapi在元素名称上不包含前缀。在大多数实际应用中,这与浏览器使用HTML解析器解析时的情况相同。
因此,总而言之,您需要知道您是使用XML解析器还是HTML解析器解析XHTML,以及该特定解析器如何将元素分配给命名空间,以便能够编写正确的XPath来查询文档中的元素。

关于html - HTML,XMLNS, namespace ,XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5709337/

有关html - HTML,XMLNS, namespace ,XML的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  4. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  5. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  6. ruby-on-rails - capybara ::ElementNotFound:无法找到 xpath "/html" - 2

    我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'

  7. ruby - 如何使用 Ruby 将 CSV 文件读入 HTML 表格? - 2

    我正在尝试将一个简单的CSV文件读入HTML表格以在浏览器中显示,但我遇到了麻烦。这就是我正在尝试的:Controller:defshow@csv=CSV.open("file.csv",:headers=>true)end查看:输出:NameStartDateEndDateQuantityPostalCode基本上我只获取标题,而不会读取和呈现CSV正文。 最佳答案 这最终成为最终解决方案:Controller:defshow#OpenaCSVfile,andthenreaditintoaCSV::Tableobjectforda

  8. 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

  9. ruby-on-rails - 连接字符串时如何在 <%=%> block 内输出 html_safe? - 2

    考虑一下:现在这些情况:#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2我需要用其他字符串输出URL。我如何保证&符号不会被转义?由于我无法控制的原因,我无法发送&。求助!把我的头发拉到这里:\编辑:为了澄清,我实际上有一个像这样的数组:@images=[{:id=>"fooid",:url=>"http://

  10. ruby-on-rails - 我需要从 HTML 转到 markdown,有什么建议吗? - 2

    我正在使用Maruku,将Markdown(超集)转换为HTML,你知道我该怎么做才能从HTML转换为Markdown吗? 最佳答案 Google发现了一个名为reverse_markdown的ruby​​脚本.它似乎可以满足您的需求。 关于ruby-on-rails-我需要从HTML转到markdown,有什么建议吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/175162

随机推荐