PHP XML Strateji: "Bean" doldurmak için DOM Ayrıştırma

2 Cevap php

Ben bir xml dosyası içinde veri ile bir veri "fasulye" doldurmak için nasıl iyi bir strateji ile ilgili bir sorum var.

Fasulye gibi görünebilir:

class Person
{
 var $id;
 var $forename = "";
 var $surname = "";
 var $bio = new Biography();
}

class Biography
{
    var $url = "";
    var $id;
}

bilgi içeren xml altağaç bu gibi görünebilir:

<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>

At the moment, I have one approach using DOMDocument. A method iterates over the entries and fills the bean by "remembering" the last node. I think thats not a good approach.

What I have in mind is something like preconstructing some xpath expression(s) and then iterate over the subtrees/nodeLists. Return an array containing the beans as defined above eventually.

However, it seems not to be possible reusing a subtree /DOMNode as DOMXPath constructor parameter.

Size kimse böyle bir sorunla karşılaştı?

2 Cevap

Eğer şablon bir tür olarak bir XML dosyası kullanılarak demek istediniz?

Sen boş kişi veya biyografisi düğümü oluşturmak için bazı fabrika kullanmak ve sonra da onu beslemek, veya DTD'leridir kullanarak doğrulamak

Seçilen DOM düğümler üzerinde bir XPath kullanarak arama yapabilirsiniz, bkz php DOMXpath manual

hayır. XML gerçek veriler içeriyor. Ben (unfortunenatly o ... PHP :/ sormayın neden olmalı) bir php dizi haline dönüştürmek gerekir.

---> Sen boş kişi veya biyografisi düğümü oluşturmak için bazı fabrika kullanmak ve sonra da onu beslemek veya DTD'leridir kullanarak doğrulamak

"Fasulye" sorun değil ... fasulye listesini İnşası i mümkün olduğunca genel olarak tutmak istiyorum çünkü .. belki asıl sorun, çözümle ilgili düşündüm daha zor ..

Burada ben sadece yazdığım bazı java kodu, belki size bir fikir olduğunu ..

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 is just a simple iterative xml traverser .. Attribute another Bean for Value and Name.

Bu çözüm, iyi çalışır durumda verilen bir "kişi" düğüm Ancak, kod ayrıştırılması için gereken tüm diğer elemanlar için büyük ölçüde büyümeye olabilir .. var ..

Ben hazır çözümler, doğru yönde küçük bir ipucu beklemeyin .. :)

Alkış,

Mikrofon