PHP XML策略:解析DOM以填充“Bean”
我有一个关于如何用xml文件中的数据填充数据bean的好策略的问题 bean可能如下所示:PHP XML策略:解析DOM以填充“Bean”,php,dom,mapping,javabeans,Php,Dom,Mapping,Javabeans,我有一个关于如何用xml文件中的数据填充数据bean的好策略的问题 bean可能如下所示: class Person { var $id; var $forename = ""; var $surname = ""; var $bio = new Biography(); } class Biography { var $url = ""; var $id; } <root> <!-- some more parent elements befor
class Person
{
var $id;
var $forename = "";
var $surname = "";
var $bio = new Biography();
}
class Biography
{
var $url = "";
var $id;
}
<root>
<!-- some more parent elements before node(s) of interest -->
<person>
<name pre="forename">
Foo
</name>
<name pre="surname">
Bar
</name>
<id>
1254
</id>
<biography>
<url>
http://www.someurl.com
</url>
<id>
5488
</id>
</biography>
</person>
</root>
包含信息的xml子树可能如下所示:
class Person
{
var $id;
var $forename = "";
var $surname = "";
var $bio = new Biography();
}
class Biography
{
var $url = "";
var $id;
}
<root>
<!-- some more parent elements before node(s) of interest -->
<person>
<name pre="forename">
Foo
</name>
<name pre="surname">
Bar
</name>
<id>
1254
</id>
<biography>
<url>
http://www.someurl.com
</url>
<id>
5488
</id>
</biography>
</person>
</root>
目前,我有一种使用DOMDocument的方法。方法
迭代条目并通过记忆来填充bean
最后一个节点。我认为这不是一个好办法
我想到的是类似于预先构造一些xpath的东西
表达式,然后在子树/节点列表上迭代。回来
包含上述bean的数组
但是,似乎不可能重用子树/DOMNode
作为XPath构造函数参数
你们中有人遇到过这样的问题吗?你们的意思是使用XML文件作为一种模板吗 您可以使用一些工厂来构建空的person或传记节点,然后将其馈送,或者使用DTD进行验证
您可以在选定的DOM节点上使用xpath进行搜索,请参见编号。XML包含真实数据。我需要把它转换成一个php数组,不幸的是,它必须是php:/不要问为什么 -->您可以使用一些工厂来构建空的person或传记节点,然后将其馈送,或者使用DTD进行验证 豆子不是问题。。。构建bean列表比我想象的要困难。。也许主要的问题与解决方案有关,因为我想让它尽可能一般化 这是我刚刚写的一些java代码,也许你会有一个想法
public List<PersonBean> extract(String xml) throws Exception {
InputSource is =new InputSource(new StringReader(xml));
XPathFactory xfactory = XPathFactory.newInstance();
XPath xpath = xfactory.newXPath();
NodeList nodeList = (NodeList)xpath.evaluate("/root/person", is, XPathConstants.NODESET);
int length = nodeList.getLength();
int pos = -1;
Traverser tra = new Traverser();
Attribute nameAttr = new Attribute();
nameAttr.setName("attr");
while(++pos < length) {
PersonBean bean = new PersonBean();
Node person = nodeList.item(pos);
Node fore = tra.getElementByNodeName(person, "id");
nameAttr.setValue("forename");
Node pre = tra.getElementByNodeNameWithAttribute(person,"name",nameAttr);
nameAttr.setValue("surname");
Node sur = tra.getElementByNodeNameWithAttribute(person, "name", nameAttr);
bean.setForeName(pre.getTextContent());
bean.setSurName(sur.getTextContent());
bean.setId(fore.getTextContent());
Node bio = tra.getElementByNodeName(person, "biography");
Node bid = tra.getElementByNodeName(bio, "id");
Node url = tra.getElementByNodeName(bio, "url");
BiographyBean bioBean = new BiographyBean();
bioBean.setId(bid.getTextContent());
bioBean.setUrl(url.getTextContent());
bean.setBio(bioBean);
persons.add(bean);
}
return persons;
}
Traverser只是一个简单的迭代xml遍历器。。
属性为Value和Name指定另一个Bean
考虑到存在人员节点的情况,此解决方案工作正常。。但是,对于需要解析的所有其他元素,代码可能会急剧增长
我并不期待现成的解决方案,只是一个正确方向的小提示
干杯
Mike您熟悉SimpleXML吗?也许有一些映射框架。类似于JAXB的东西,可以将php对象序列化为xml,反之亦然。