我有一组XML文档,它们共享相同的模式。 (如果重要的话,它们是具有语义标签的SAPI语法。)我可以使用文档来匹配文本字符串,返回一组具有已知值的属性。
我的问题是我想要获取一组属性值并从语法中生成一个字符串(当提交给语法时)将生成相同的属性值集。更复杂的是,不同的语法具有不同顺序的标签(语法用于不同的自然语言),所以我不能做一个简单的树步行。
有人对这个问题有好的方法吗?
编辑:以下是一组语法示例:
语法1(英文):
<GRAMMAR LANGID="409">
<DEFINE>
<ID NAME="NUMBERS1THROUGH8_ID" VAL="6503" />
<ID NAME="NUMBERCOMMAND" VAL="-1"/>
<ID NAME="NUMBER1" VAL="1"/>
<ID NAME="NUMBER2" VAL="2"/>
<ID NAME="NUMBER3" VAL="3"/>
<ID NAME="NUMBER4" VAL="4"/>
<ID NAME="NUMBER5" VAL="5"/>
<ID NAME="NUMBER6" VAL="6"/>
<ID NAME="NUMBER7" VAL="7"/>
<ID NAME="NUMBER8" VAL="8"/>
<ID NAME="NUMBER9" VAL="9"/>
</DEFINE>
<RULE NAME="ChooseSynoynms">
<L>
<P>choose</P>
<P>number</P>
<P>select</P>
<P>click</P>
</L>
</RULE>
<RULE NAME="NumberList">
<LN PROPNAME="numberCommand" PROPID="NUMBERCOMMAND">
<PN VAL="NUMBER1">one</PN>
<PN VAL="NUMBER2">two</PN>
<PN VAL="NUMBER3">three</PN>
<PN VAL="NUMBER4">four</PN>
<PN VAL="NUMBER5">five</PN>
<PN VAL="NUMBER6">six</PN>
<PN VAL="NUMBER7">seven</PN>
<PN VAL="NUMBER8">eight</PN>
<PN VAL="NUMBER9">nine</PN>
</LN>
</RULE>
<RULE ID="NUMBERS1THROUGH8_ID" TOPLEVEL="INACTIVE">
<O %COMMAND_WEIGHT%><RULEREF NAME="ChooseSynoynms"/></O>
<RULEREF NAME="NumberList" />
<O>
<P PROPNAME="ExplicitOK" VAL="1">ok</P>
</O>
</RULE>
</GRAMMAR>
语法2 :(德语)
<GRAMMAR LANGID="409">
<DEFINE>
<ID NAME="NUMBERS1THROUGH8_ID" VAL="6503" />
<ID NAME="NUMBERCOMMAND" VAL="-1"/>
<ID NAME="NUMBER1" VAL="1"/>
<ID NAME="NUMBER2" VAL="2"/>
<ID NAME="NUMBER3" VAL="3"/>
<ID NAME="NUMBER4" VAL="4"/>
<ID NAME="NUMBER5" VAL="5"/>
<ID NAME="NUMBER6" VAL="6"/>
<ID NAME="NUMBER7" VAL="7"/>
<ID NAME="NUMBER8" VAL="8"/>
<ID NAME="NUMBER9" VAL="9"/>
</DEFINE>
<RULE NAME="ChooseSynoynms">
<L>
<P>wahlen</P>
<P>Nummer</P>
<P>auswahlen</P>
<P>klicken</P>
</L>
</RULE>
<RULE NAME="NumberList">
<LN PROPNAME="numberCommand" PROPID="NUMBERCOMMAND">
<PN VAL="NUMBER1">eins</PN>
<PN VAL="NUMBER2">zwei</PN>
<PN VAL="NUMBER3">drei</PN>
<PN VAL="NUMBER4">vier</PN>
<PN VAL="NUMBER5">funf</PN>
<PN VAL="NUMBER6">sechs</PN>
<PN VAL="NUMBER7">sieben</PN>
<PN VAL="NUMBER8">acht</PN>
<PN VAL="NUMBER9">neun</PN>
</LN>
</RULE>
<RULE ID="NUMBERS1THROUGH8_ID" TOPLEVEL="INACTIVE">
<P><O>auf</O></P> <RULEREF NAME="NumberList"/>
<O>
<P PROPNAME="ExplicitOK" VAL="1">OK</P>
</O>
<P><RULEREF NAME="ChooseSynoynms"/></P>
</RULE>
</GRAMMAR>
我想要做的是指定“NumberCommand = 5”并从英语语法中选择“select 5”,并从德语语法中获得“funf klicken”。
答案 0 :(得分:2)
您是否尝试过使用XPath?
http://en.wikipedia.org/wiki/XPath_1.0
http://w3schools.com/XPath/xpath_syntax.asp
从描述中准确地解析你想要做的事情也有点困难。如果您粘贴了一些XML文档的示例子集,它可能会有所帮助。
修改强>
这是一个潜在的XPath查询,可以获得“NUMBER5”条目(警告,未经测试):
/GRAMMAR/RULE[@NAME='NumberList']/LN[@PROPNAME='numberCommand']/PN[@VAL='NUMBER5']
以下是实际使用它的一些示例PHP代码:
$xml = new SimpleXMLElement($xmlstring);
$result = $xml->xpath(
"/GRAMMAR/RULE[@NAME='NumberList']".
"/LN[@PROPNAME='numberCommand']/PN[@VAL='NUMBER5']");
foreach($result as $xmlelement)
echo (string) $xmlelement;
但是,我无法看到如何为ChooseSynonyms检索适当的值,除非它们应该是随机的,在这种情况下我只需要检索所有值,然后从代码端随机选择一个。
答案 1 :(得分:-1)
所以我决定直接遍历语法规则(使用解析后的表单,而不是XML)并使用包含语义标记的集合。当我到达包含语义信息的节点时,我选择与适当的语义标签匹配的节点(并从集合中删除匹配);否则,我会随机进行转换。当我到达终端节点时,我验证该集是空的;如果没有,这是一个错误(我生成了一个没有所有必需标签的有效参数)。