Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP XML策略:解析DOM以填充“Bean”_Php_Dom_Mapping_Javabeans - Fatal编程技术网

PHP XML策略:解析DOM以填充“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

我有一个关于如何用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 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,反之亦然。