2016-02-12 1 views
1

Это мой XML:DOMDocument :: loadXML(): StartTag: недопустимое имя элемента в Entity

<?xml version="1.0"?> 
<data> 
    <client_name>Awesome Client</client_name> 
    <account_number/> 
    <date_created>02/12/2016</date_created> 
    <form_number>4126</form_number> 
    <customer_po/> 
    <terms_name>Credit Card</terms_name> 
    <date_shipped>12/31/1969</date_shipped> 
    <billing_contact_email/> 
    <billing_contact_address_line_1/> 
    <billing_contact_address_line_2/> 
    <billing_contact_address_line_3/> 
    <billing_contact_address_line_4/> 
    <billing_contact_address_city/> 
    <billing_contact_address_state>British Columbia</billing_contact_address_state> 
    <billing_contact_address_postal/> 
    <billing_contact_address_country>Canada</billing_contact_address_country> 
    <shipping_contact_address_line_1/> 
    <shipping_contact_address_line_2/> 
    <shipping_contact_address_line_3/> 
    <shipping_contact_address_line_4/> 
    <shipping_contact_address_city/> 
    <shipping_contact_address_state>British Columbia</shipping_contact_address_state> 
    <shipping_contact_address_postal/> 
    <shipping_contact_address_country>Canada</shipping_contact_address_country> 
    <billing_contact_first_name>another</billing_contact_first_name> 
    <billing_contact_last_name>client</billing_contact_last_name> 
    <client_rep_full_name>Rob Montebelli</client_rep_full_name> 
    <order_rep_full_name>Mark Graham</order_rep_full_name> 
    <job_name>77777</job_name> 
    <job_number>2620</job_number> 
    <event_type>Donor Gift</event_type> 
    <due_date>02/12/2016</due_date> 
    <shipping_method/> 
    <currency>CAD</currency> 
    <total_taxes>0.00</total_taxes> 
    <total_subtotal>1,760.16</total_subtotal> 
    <total>1,760.16</total> 
    <items> 
     <item0> 
      <taxes> 
       <0>E</0> 
      </taxes> 
      <title>1889-24</title> 
      <quantity>6</quantity> 
      <description>Carhartt (R) Signature Utility Duffel; TBD TBD</description> 
      <unit_price>159.32</unit_price> 
     </item0> 
     <item1> 
      <taxes> 
       <0>E</0> 
      </taxes> 
      <title>0022-56</title> 
      <quantity>12</quantity> 
      <description>Zoom (TM) DayTripper Sling Compu-Messenger; TBD TBD</description> 
      <unit_price>67.02</unit_price> 
     </item1> 
    </items> 
</data> 

Мой код:

$xml_data = new SimpleXMLElement('<?xml version="1.0"?><data></data>'); 
array_to_xml($invoice, $xml_data); 
$xml = $xml_data->asXML(); 

$domxml = new DOMDocument('1.0'); 
$domxml->preserveWhiteSpace = false; 
$domxml->formatOutput = true; 
$domxml->loadXML($xml); 
$xml_string = $domxml->saveXML(); 

Я думаю, что XML в нужном формате, так почему это провал?

Edit:

Вот динамический массив, прежде чем преобразованы в XML с помощью XMLSimpleElement, есть в любом случае, чтобы удалить < 0>, прежде чем преобразованы в XML ?:

Array 
(
    [invoices] => Array 
     (
      [0] => Array 
       (
        [client_name] => Awesome Client 
        [account_number] => 
        [date_created] => 02/11/2016 
        [form_number] => 4104 
        [customer_po] => 
        [terms_name] => Credit Card 
        [date_shipped] => 12/31/1969 
        [billing_contact_email] => 
        [billing_contact_address_line_1] => 
        [billing_contact_address_line_2] => 
        [billing_contact_address_line_3] => 
        [billing_contact_address_line_4] => 
        [billing_contact_address_city] => 
        [billing_contact_address_state] => British Columbia 
        [billing_contact_address_postal] => 
        [billing_contact_address_country] => Canada 
        [shipping_contact_address_line_1] => 
        [shipping_contact_address_line_2] => 
        [shipping_contact_address_line_3] => 
        [shipping_contact_address_line_4] => 
        [shipping_contact_address_city] => 
        [shipping_contact_address_state] => British Columbia 
        [shipping_contact_address_postal] => 
        [shipping_contact_address_country] => Canada 
        [billing_contact_first_name] => another 
        [billing_contact_last_name] => client 
        [client_rep_full_name] => Rob Montebelli 
        [order_rep_full_name] => Mark Graham 
        [job_name] => 5010 
        [job_number] => 2598 
        [event_type] => Donor Gift 
        [due_date] => 02/11/2016 
        [shipping_method] => 
        [currency] => CAD 
        [total_taxes] => 0.00 
        [total_subtotal] => 1,760.16 
        [total] => 1,760.16 
        [items] => Array 
         (
          [0] => Array 
           (
            [taxes] => Array 
             (
              [0] => E 
             ) 

            [title] => 1889-24 
            [quantity] => 6 
            [description] => Carhartt (R) Signature Utility Duffel; TBD TBD 
            [unit_price] => 159.32 
           ) 

          [1] => Array 
           (
            [taxes] => Array 
             (
              [0] => E 
             ) 

            [title] => 0022-56 
            [quantity] => 12 
            [description] => Zoom (TM) DayTripper Sling Compu-Messenger; TBD TBD 
            [unit_price] => 67.02 
           ) 

         ) 

       ) 

     ) 

) 
+3

Параметр '' <0> бросает это отключено, это недопустимое имя элемента. – chris85

+0

@ chris85 О, я вижу, есть ли способ удалить его с помощью функции или я должен удалить его из массива, прежде чем преобразовать его в xml? – Blkc

+0

Удалить элемент или предупреждение? – chris85

ответ

2

Как уже упоминалось в комментариях вопрос с вашими элементами число, <0>. Это недопустимое имя элемента. Вы можете вручную изменить XML-файл, если это статический файл, удалить или переименовать, использовать регулярное выражение или подавить ошибку. Если вы подавите, вам придется помнить, что в будущем он никогда не расскажет вам об ошибках.

Regex подход:

$invoice = preg_replace('~<(/?\d)~', '<number$1', $invoice); 

Regex демо: опция https://regex101.com/r/pZ3sJ4/1

Одно подавление:

libxml_use_internal_errors(true); 
$domxml->loadXML($invoice); 
libxml_clear_errors(); 

При таком подходе вы можете извлекать ошибки довольно легко.

например.

libxml_use_internal_errors(true); 
$domxml->loadXML($invoice); 
$xml_string = $domxml->saveXML(); 
$errors = libxml_get_errors(); 
foreach ($errors as $error) { 
    echo $error->message; 
} 
libxml_clear_errors(); 

Второй вариант подавления:

@$domxml->loadXML($invoice); 

Тьфу ..

Третий простой без программирования вариант, просто отредактировать файл вручную:

<item1> 
      <taxes><name0>E</name0></taxes> 
      <title>0022-56</title> 
      <quantity>12</quantity> 
      <description>Zoom (TM) DayTripper Sling Compu-Messenger; TBD TBD</description> 
      <unit_price>67.02</unit_price> 
     </item1> 
+0

Я применил регулярное выражение к $ xml, но у меня есть эта ошибка: 'DOMDocument :: loadXML(): рассогласование и окончание тегов: number0 строка 2 и налоги в Entity' – Blkc

+0

Проблема заключалась в том, что закрывающий тег не был заменен на Blkc

+0

Этот ответ велик, если у вас нет контроля над исходным XML. Если вы сами генерируете XML, ответ заключается не в том, чтобы заманить результат, а в том, чтобы исправить ваш генератор, чтобы ** создать правильный XML в первую очередь **. – IMSoP

Смежные вопросы