DTD - 如何强制隐含属性的位置

时间:2014-04-29 10:26:27

标签: php xml regex dtd

我以XML格式手动将自行车骑行记录到我的电脑中 - 并用我自己的PHP脚本解析它。

我知道我可以在代码中强制元素的位置 - 例如:

<!ELEMENT Ride (Start, Through*, Finish) >

元素Ride具有以下属性

<!ATTLIST Ride  Number CDATA #REQUIRED
        Purpose CDATA #IMPLIED
        Comment CDATA #IMPLIED
        Date CDATA #IMPLIED >

我的问题是,如果我可以说所有这些属性只能在这个序列中 - 即使其中三个只是暗示(不是必要的)。

这样做的目的是,如果我写错了属性序列,PHP脚本就无法解析它 - 因为它只是为这个序列编写的。然后使用这种错误的属性序列不包含在导出和解析中。

用于解析乘坐的介绍数据的当前正则表达式是:

/\<Ride Number="([0-9]*)"( Purpose="([^\"]*)")?( Comment="([^\"]*)")?( Date="([^\"]*)")?\>(.*)\<\/Ride\>/sU

我还想到了那个正则表达式的变化,但它可能太长了......因此不太可读。

2 个答案:

答案 0 :(得分:1)

正则表达式和XML不能混合使用。 XML规范声明属性序列不重要:

 the order of attribute specifications in a start-tag or empty-element tag is not significant

检查XML Specification第3.1节

您需要使用PHP XML表达式而不是正则表达式。 Simple XML可能已经足够好了。

答案 1 :(得分:1)

不,XML DTD和我熟悉的任何其他XML模式语言都没有提供约束属性顺序的方法。正如stwissel已经指出的那样,XML规范说明属性的顺序并不重要。

您的选择包括:

  • 编写过滤器以接受具有任何顺序属性的XML,并按照您希望它们出现的顺序发出相同的XML;
  • 改进(或至少:更改)现有的PHP代码以接受任意顺序的属性;
  • 重写您的PHP代码以使用XML感知工具包,以便更轻松地处理属性顺序的非确定性;
  • 重新设计XML词汇表,使有问题的属性显示为子元素,以便您可以强制它们按照规定的顺序出现。

我不会说XML和正则表达不会混合。但是,当您将正则表达式应用于XML时,您需要处理XML语法的基本事实。