战略分析很多很多不好的形成SGML/XML文件
-
26-09-2019 - |
题
我有成千上万的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,你会需要处理。(你可能不想要走这条路,但是它可能有助于提供信息的目的。):
DOCTYPE声明
DOCTYPE宣言》在例子是一个完全有效的SGML doctype.的
[]
(内部的子集)没有任何东西。如果你有声明在内的子集(通常实体声明),你在超过可能必须要保持一doctype宣言》在XML。问题XML parser有,你没有系统的标识符的宣言》。在XML doctype宣言》,该系统的标识是必需的,如果有一个公共标识符。在SGML doctype声明,它不是必需的。
底线:除非你需要XML分析,以DTD/架构或有声明在内的子集,条doctype宣言》。如果XML必须是有效的,你至少需要增加一个系统的标识符。不要忘记加入
<?xml ...?>
处理指令。元素不端的标签
的
<hardhyphen>
和<hyphen>
元素都是有效的SGML.SGML DTD的允许指定标记的最小化。这是什么意思是,你可以指定是否结束标记是必需的。(你还可以使开始标记可选择的,但是,这是疯话.) 在XML你必须关闭这些要素(象<hardhyphen/>
或<hardhyphen></hardhyphen>
)最好的事情就是看看你SGML DTD,看看是什么因素有可选的结束标记。标记的最小化是指定右后的元素名称的元素的宣言》。A'-'装置的标记是必需的。一个'o'(字母'哦')指标是可选择的。例如,如果你看到
<!ELEMENT hyphen - o (#PCDATA)>
, 这意味着,开始标记是必需的(-
)和结束标记是可选择的(o
).如果你看到<!ELEMENT hyphen - - (#PCDATA)>
,两个的开始和结束的标记是必需的。底线:正确地接近所有的元素,没有结束标
处理指令
处理的说明(PI)在SGML没有第二次
?
当他们被关闭XML等。你需要添加第二个?
.例SGML PI:
<?asdf jkl>
例XML PI:
<?asdf jkl?>
内含物/排除
你可能不必担心这个的,但在一个SGML DTD你可以指定在一个元素的宣言,另一个元件是允许的内的任何地方的这元(或不允许的)。这可能是一个痛苦的,如果你的目标XML需要分析到DTD;XML DTD是不允许的内含物/排除。
这是什么一个包容可能看起来像:
<!ELEMENT chapter - - (section)+ +(revst|revend)>
这是说
revst
或revend
允许内的任何地方的chapter
.如果元素的宣言》-(revst|revend)
, 它会意味着revst
或revend
是 不 允许内的任何地方的chapter
.
希望这会有所帮助。
其他提示
对,使用引入nokogiri 。
向下滚动该网页上的一点,在“大纲”的代码复制到一个文件,说xml-parser.rb
。然后,如果你是Mac(Ruby有已经安装在Mac上。),从终端,运行gem install nokogiri
上,然后运行与文件:ruby xml-parser.rb
您还可以再从终端类型irb
右侧,然后require 'nokogiri'
,并开始玩弄实时引入nokogiri API。爱是爱的互动红宝石。 :)
如果您使用的是Windows,试试这个红宝石的Windows安装程序