Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Parsowanie XML [Problem]
Forum PHP.pl > Forum > PHP
fantek
Witam. Mam do Sparsowania XML do stringa który będzie później wklejony do inputa typu textarea (bądź kilka inputów jeśli dało by rade podzielić tego XML'a na jakieś sensowne części) .
String ma być mniej więcej w formacie:
Tag:wartość

Problem jest taki, że jest w tym XML'u bardzo dużo zagnieżdżeń i nie wiem w jaki sposób mógł bym go sparsować albo podzielić jakoś na części żeby te informacje były czytelne i wiadomo co do czego się odnosiło.

XML można obejrzeć tutaj: https://universaltravelhouse.co.uk/orders.a...E6-B6AEBB0FFBED

Może ktoś doradzić jak można by było to zrobić ?
Pyton_000
Ni chusteczki nie rozumiem co chcesz osiągnąć...
fantek
Przykładowo:

  1. <Prod_Data>
  2. <AccommodationResult>
  3. <ID>4.0</ID>
  4. <GIATAID>0</GIATAID>
  5. <AccommodationName>HOTEL BEST WESTERN CDG AIRPORT</AccommodationName>
  6. <Passengers>
  7. <Passenger>
  8. <Title>Mr</Title>
  9. <Firstname>lloyge</Firstname>
  10. <MiddleInitials/>
  11. <Surname>brown</Surname>
  12. .
  13. .
  14. .



Chciał bym doprowadzić do postaci textu np w takiej psotaci:

  1. (Input) Product Data a w nim:
  2. ID: 4.0
  3. GIATAID: 0
  4. AccommodationName: HOTEL BEST WESTERN CDG AIRPORT
  5. Passengers -> Passenger
  6. 0
  7. Title:Mr
  8. Firstname:lloyge
  9. itd.

Pyton_000
A możesz powiedzieć po co Ci takie cudactwo ?
fantek
Po prostu klient chce mieć coś takiego biggrin.gif Nie wnikam po co mu to.

Z takeigo formatu:
  1. <Products>
  2. <Product>
  3. <Prod_ID>1932</Prod_ID>
  4. <Prod_TypeCode>ACC</Prod_TypeCode>


Zrobić taki:

  1. Products
  2. Product
  3. Prod_ID:1932
  4. Prod_TypeCode:ACC
  5.  
  6. itd.


po prostu zlikwidować wszystkie <,>,/< i o każdego tagu dodać :.
Pyton_000
To bardzo źle że nie wnikasz. Jakbyś wiedział dokładnie po co to, dla czego i jaki to ma cel to byś wiedział co z tym zrobić ew. zaproponować mu coś innego co spełni jego wymagania

A jeśli chodzi o Twój problem to preg_replace
fantek
Tzn. wiem dokładnie po co to i do czego (od strony klienta) i wiem że powinno się to zrobić inaczej "ale" tak jak powiedział mi przełożony jedynie tak możemy mu to przedstawić w cenie którą do tej pory zapłacił więc tak mam zrobić. To co powinno być dokładnie to zajęło by około ponad tygodnia więc nie mnie to rozstrzygać. Tak mi kazano zrobić i tak zrobię biggrin.gif

A co do mojego problemu. Moge użyć preg_replace ale string jest w formacie

  1. <HandOff><Order><Order_ID>1662</Order_ID><Order_CheckoutDateTime>2015-03-24 14:21</Order_CheckoutDateTime><Order_AffID>


I teraz problem w którym miejscu zrobić "\n" i tabulatory żeby odpowiednio porobić strukturę drzewa ?
fantek
Ok udało mi się doprowadzić to do dobrego formatu. teraz pozostało mi jedynie usunąć wszystkie zamykające znaczniki </ >

próbuje przez taką formułkę :
preg_replace('/\<\/(.*)\>/', '', $xml_string);

gdzie:
\<\/ oznacza </
(.*) oznacza wszystko pomiędzy
\> oznacza >

Przynajmniej tak to rozumiem ale te wyrażenie mi nie działa sad.gif

Może ktoś podpowiedziec co w nim jest źle ?
Pyton_000
.* na [^>]*

I co to znaczy nie działa.
fantek
$xml_string =

  1. <?xml version="1.0"?>
  2. <ID>4.0</ID>
  3. <GIATAID>0</GIATAID>
  4. <AccommodationName>HOTEL BEST WESTERN CDG AIRPORT</AccommodationName>
  5. <Attributes>
  6. <Attribute>
  7. <ID>0</ID>
  8. <Name>ItineraryId</Name>
  9. <Value>si1013</Value>
  10. </Attribute>
  11. <Attribute>
  12. <ID>0</ID>
  13. <Name>AccommodationCode</Name>
  14. <Value>0000072956</Value>
  15. </Attribute>
  16. <Attribute>
  17. <ID>0</ID>
  18. <Name>AccommodationId</Name>
  19. <Value>2662630</Value>
  20. </Attribute>
  21. <Attribute>
  22. <ID>0</ID>
  23. <Name>AccommodationName</Name>
  24. <Value>HOTEL BEST WESTERN CDG AIRPORT</Value>
  25. </Attribute>
  26. <Attribute>
  27. <ID>0</ID>
  28. <Name>NormalisedName</Name>
  29. <Value>BEST WESTERN CDG AIRPORT</Value>
  30. </Attribute>
  31. <Attribute>
  32. <ID>0</ID>
  33. <Name>ResortName</Name>
  34. <Value>Charles de Gaulle</Value>
  35. </Attribute>
  36. <Attribute>
  37. <ID>0</ID>
  38. <Name>ResortId</Name>
  39. <Value>3332</Value>
  40. </Attribute>
  41. <Attribute>
  42. <ID>0</ID>
  43. <Name>StartDate</Name>
  44. <Value>20150326</Value>
  45. </Attribute>
  46. <Attribute>
  47. <ID>0</ID>
  48. <Name>EndDate</Name>
  49. <Value>20150327</Value>
  50. </Attribute>
  51. <Attribute>
  52. <ID>0</ID>
  53. <Name>SuppliersBoardCode</Name>
  54. <Value>RO</Value>
  55. </Attribute>
  56. <Attribute>
  57. <ID>0</ID>
  58. <Name>BoardCode</Name>
  59. <Value>RO</Value>
  60. </Attribute>
  61. <Attribute>
  62. <ID>0</ID>
  63. <Name>ClassCode</Name>
  64. <Value>4*</Value>
  65. </Attribute>
  66. <Attribute>
  67. <ID>0</ID>
  68. <Name>Supplier</Name>
  69. <Value>AZS</Value>
  70. </Attribute>
  71. <Attribute>
  72. <ID>0</ID>
  73. <Name>NumNights</Name>
  74. <Value>1</Value>
  75. </Attribute>
  76. <Attribute>
  77. <ID>0</ID>
  78. <Name>BasicAdultCost</Name>
  79. <Value>46.8</Value>
  80. </Attribute>
  81. <Attribute>
  82. <ID>0</ID>
  83. <Name>Currency</Name>
  84. <Value>GBP</Value>
  85. </Attribute>
  86. <Attribute>
  87. <ID>0</ID>
  88. <Name>Availability</Name>
  89. <Value>available</Value>
  90. </Attribute>
  91. <Attribute>
  92. <ID>0</ID>
  93. <Name>SupplierLocationId</Name>
  94. <Value>987</Value>
  95. </Attribute>
  96. <Attribute>
  97. <ID>0</ID>
  98. <Name>Type</Name>
  99. <Value>Hotel</Value>
  100. </Attribute>
  101. <Attribute>
  102. <ID>0</ID>
  103. <Name>BookableByFAB</Name>
  104. <Value>true</Value>
  105. </Attribute>
  106. <Attribute>
  107. <ID>0</ID>
  108. <Name>SyndicatorRanking</Name>
  109. <Value>100</Value>
  110. </Attribute>
  111. </Attributes>



preg_replace('/\<\/([^>]*)\>/', '', $xml_string);

Powinno usunąć wszystkie </ID>,</Name>,</Value> itd. Ale nie usuwa sad.gif
Pyton_000
/<\/([^>]*)>/g
fantek
Nie działało bo użyłem htmlentities($xml_string) przed preg_replace('/\<\/([^>]*)\>/', '', $xml_string);



Jak użyłem $xml_string = preg_replace('/\<\/([^>]*)\>/', '', $xml_string); a potem htmlentities($xml_string) i zaczęło wszystko działać i pozamieniało.

Ciekawi mnie tylko dlaczego ? Jakie ma znaczenie użycie htmlentities przed i po preg_replace ?


Dzięki za pomoc Pyton_000 smile.gif





A jeszcze brakuje mi jednej rzeczy.


Chciał bym również pousuwać wszystkie CRLF (\r\n) tzn mam taki string:

  1. Surname:brown\r\n
  2. DOB:1977-10-12T00:00:00\r\n
  3. Type:Adult\r\n
  4. Gender:Unspecified\r\n
  5. IsLead:true\r\n
  6. IsDisabled:false\r\n
  7. EmailAddress:taniya@universaltravelhouse.co.uk\r\n
  8. \r\n
  9. \r\n
  10. FOIDIssue:1900-01-01T00:00:00\r\n
  11. FOIDExpiry:1900-01-01T00:00:00\r\n


I chodzi o to żeby pousuwać wszystkie \r\n przed którymi mogą być tylko spacje lub tabulatory. Jak powinna wyglądać wtedy regułka ?
Pyton_000
'/^\s*\\r\\n$/'

htmlentities zamienia < na & lt; Poczytaj w manualu
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.