Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Odczyt atrybutu z przestrzenią nazw, SimpleXML - problemy. Może inne rozwiązania?
WebCM
post
Post #1





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

Ostrzeżenie: (0%)
-----


Jest sporo problemów z analizą XHTML w PHP przez funkcje XML. Kilka już rozwiązałem, stosując różne tricki i obejścia. Jednak jest kolejny - jak pobrać wartość atrybutu z przestrzenią nazw? Wprawdzie można zrezygnować z namespace, lecz lepiej zaznaczyć w kodzie XHTML, że znacznik lub atrybut należy do dziedziny F3.
  1. <input type="checkbox" id="something" f3:var="config.item" />

  1. <?php
  2. foreach(xpath('//input[@id="ms"]') as $item) echo $item['f3:var'];
  3. ?>
Niestety, nie działa. Nawet $f3->item['var'].

A może zastosowanie funkcji preg_* i str_* lepiej nadaje się do analizy kodu XHTML? Właściwie operacje na XML-u wykonuję tylko po to, aby odczytać wartości paru atrybutów, np. f3:var, z tym że:
- jeśli znajdzie się w <form>, trzeba przejechać wszystkie pola: checkbox, radio i select i odczytać ich nazwy
- gdy znajdzie się w tych polach - dotyczy tylko tych pól
Trzeba potem jeszcze wstawić instrukcję warunkową. Za pomocą SimpleXML tylko pobieram kod pola do zamiany przez str_replace(), bo w XML-u tego raczej nie zrobię. Przykładowy wynik:
Kod
<input type="checkbox" id="something" <?php if($config['item']) echo 'checked="checked" ';?>/>
LUB:
<?php if($config['item']) echo '<input type="checkbox" id="something" checked="checked" />'; else echo '<input type="checkbox" id="something" />'; ?>

Właściwie zaletą parsera XML jest to, że wyrzuci błąd, gdy jakiś znacznik jest niezamknięty, lecz uruchamiam go dopiero wtedy, gdy znajduje się w szablonie choć 1 znacznik <form>. Może nie ma to nawet sensu?

Ten post edytował WebCM 25.04.2008, 16:44:16
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
Strzałek
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 384
Pomógł: 6
Dołączył: 11.09.2004
Skąd: Grodzisk Mazowiecki

Ostrzeżenie: (0%)
-----


Cytat(WebCM @ 25.04.2008, 17:43:25 ) *
Jest sporo problemów z analizą XHTML w PHP przez funkcje XML. Kilka już rozwiązałem, stosując różne tricki i obejścia. Jednak jest kolejny - jak pobrać wartość atrybutu z przestrzenią nazw? Wprawdzie można zrezygnować z namespace, lecz lepiej zaznaczyć w kodzie XHTML, że znacznik lub atrybut należy do dziedziny F3.



Śliska sprawa z tym parsowaniem. Otóż tak jak napisałeś. Są 2 drogi - pierwsza potraktować że dokument (X)HTML jest dokumentem xml, albo przeparsować dokument wyrażeniami regularnymi. Pierwsze rozwiązanie jest lepsze ale bardzo kłopotliwe. Otóż wystarczy że ktoś nieopatrznie da <br> zamiast <br /> i już sypie nam że dokument ma nie zamknięty tag. Jeżeli chodzi o drugie rozwiązanie to nie ma problemu z nie zamkniętymi tagami typu <br> jednak jest trochę zabawy z samym parsowaniem (której ja osobiście nie lubię.

Podsumowując, XML jest lepszym i wygodniejszym rozwiązaniem. Możesz sobie ładnie użyć DOM'a, SimpleXML'a czy czego tam sobie zapragniesz. Jednak, decydując się na to rozwiązanie musisz mieć pewność że twój dokument będzie można potraktować jako XML. Głównym zagrożeniem są dane "od ludzi". Dane które pan Jan Kowalski wrzuca używając jakiegoś tam panelu administracyjnego. Pan Jan HTML może i zna. Ale wirtuozem to on nie jest i nie liczył bym że będzie wrzucał poprawny XHTML w treść np.: newsów. Z tym można poradzić sobie używając rozszerzenia Tidy, które za nas "posprząta" kod.


Nie wiem do końca co chcesz zrobić. Jednak skojarzyło mi się to z pewnym rozwiązaniem które jest w Agavi. Mianowicie FormPopulationFilter. Jego zadania to wypełniać inputy itp. jeżeli ich wartość "siedzi w POST" oraz jeżeli wystąpił błąd validatora Agavi dodawać do elementów formularza class="error"
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


  1. <?php
  2. $str= '<root xmlns:foo="http://gdzies.t.am/def">
  3. <child foo:bar="qwerty" foo:aaa="BBB">i am the child</child>
  4. </root>';
  5. $xml = new SimpleXMLElement($str);
  6. $child = $xml->child;
  7. $nss = $xml->getDocNamespaces();
  8. $attributes = $child->attributes( $nss['foo']);
  9. foreach ( $attributes as $k => $v )
  10. {
  11. printf( "[%s] == %s<br />", $k, $v );
  12. }
  13. print_r( $nss );
  14. ?>


1. google
2. http://www.sitepoint.com/blogs/2005/10/20/...and-namespaces/
3. manual (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
?>
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.12.2025 - 05:53