我有成千上万的SGML文件,一些形成的,一些不那么成的。我需要得到某些要素的文件,但每次我去的载荷与试着读他们进入一个XDocument,如下的,或甚至只是一个StreamReader,我获得不同的各种XMLException错误。

类似的事情"'['是一个意想不到的标记。".为什么?因为我有一个文件与DOCTYPE喜欢

<!DOCTYPE RChapter PUBLIC "-//LSC//DTD R Chapter for Authoring//EN" [] >

我已经了解到,"[]"需要有一些有效的内部。再次,我不能控制的创立文件,但我不得不"裂缝"他们得到的数据的我想要的。另一个例子是具有"不封闭的"元素,例如:

<Caption>Plants, and facilities<hardhyphen><hyphen>Inspection.</Caption>

这XMLException是"'连字符的'开始标记在27行不匹配,结束标'标题'.27行、位置58." 显而易见的,对吗?

但随后的问题是如何可以实际上你在某些元素在这些文件中,没有遇到XMLExceptions.是一个萨克斯析程序正确的方式?我基本上想要打开文件,去右件我想要的(而不必担心什么可以或者不可能形成良好附近),拉数据,并继续前进。我是不是应该忘记析与如下,XDocument,只是做简单的文字替换喜欢

str.Replace("<hardhypen><hyphen>", "-")

然后尽量载入一种XML分析程序.任何技巧战略?

有帮助吗?

解决方案

问题是,你在尝试分析SGML用XML工具。他们是不一样的。如果你想使用一种XML工具/语言以访问的数据,你可能会需要转换SGML XML之前试图来分析它。

理想的情况是你想使用一个语言/工具,支持SGML(如OmniMark)或东西,可以处理"XML,如"数据(如nokogiri从第一个答案?).

这可以相当直截了当,但是可以得到棘手的一些要点。特别是,如果你在谈论多doctypes(DTD)。(还有没有这样的东西作为"良好"SGML.是的,的要素。必须嵌套正确的,但SGML 有一个DTD。)

这里有一些差异之间的SGML和XML,你会需要处理。(你可能不想要走这条路,但是它可能有助于提供信息的目的。):

  1. DOCTYPE声明

    DOCTYPE宣言》在例子是一个完全有效的SGML doctype.的 [] (内部的子集)没有任何东西。如果你有声明在内的子集(通常实体声明),你在超过可能必须要保持一doctype宣言》在XML。

    问题XML parser有,你没有系统的标识符的宣言》。在XML doctype宣言》,该系统的标识是必需的,如果有一个公共标识符。在SGML doctype声明,它不是必需的。

    底线:除非你需要XML分析,以DTD/架构或有声明在内的子集,条doctype宣言》。如果XML必须是有效的,你至少需要增加一个系统的标识符。不要忘记加入 <?xml ...?> 处理指令。

  2. 元素不端的标签

    <hardhyphen><hyphen> 元素都是有效的SGML.SGML DTD的允许指定标记的最小化。这是什么意思是,你可以指定是否结束标记是必需的。(你还可以使开始标记可选择的,但是,这是疯话.) 在XML你必须关闭这些要素(象 <hardhyphen/><hardhyphen></hardhyphen>)

    最好的事情就是看看你SGML DTD,看看是什么因素有可选的结束标记。标记的最小化是指定右后的元素名称的元素的宣言》。A'-'装置的标记是必需的。一个'o'(字母'哦')指标是可选择的。例如,如果你看到 <!ELEMENT hyphen - o (#PCDATA)>, 这意味着,开始标记是必需的(-)和结束标记是可选择的(o).如果你看到 <!ELEMENT hyphen - - (#PCDATA)>,两个的开始和结束的标记是必需的。

    底线:正确地接近所有的元素,没有结束标

  3. 处理指令

    处理的说明(PI)在SGML没有第二次 ? 当他们被关闭XML等。你需要添加第二个 ?.

    例SGML PI: <?asdf jkl>

    例XML PI: <?asdf jkl?>

  4. 内含物/排除

    你可能不必担心这个的,但在一个SGML DTD你可以指定在一个元素的宣言,另一个元件是允许的内的任何地方的这元(或不允许的)。这可能是一个痛苦的,如果你的目标XML需要分析到DTD;XML DTD是不允许的内含物/排除。

    这是什么一个包容可能看起来像:

    <!ELEMENT chapter - - (section)+ +(revst|revend)>

    这是说 revstrevend 允许内的任何地方的 chapter.如果元素的宣言》 -(revst|revend), 它会意味着 revstrevend 允许内的任何地方的 chapter.

希望这会有所帮助。

其他提示

对,使用引入nokogiri

向下滚动该网页上的一点,在“大纲”的代码复制到一个文件,说xml-parser.rb。然后,如果你是Mac(Ruby有已经安装在Mac上。),从终端,运行gem install nokogiri上,然后运行与文件:ruby xml-parser.rb

您还可以再从终端类型irb右侧,然后require 'nokogiri',并开始玩弄实时引入nokogiri API。爱是爱的互动红宝石。 :)

如果您使用的是Windows,试试这个红宝石的Windows安装程序

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top