2009-06-16 26 views
6

Tôi muốn viết một hàm phân tích cú pháp cấu trúc dữ liệu XML chưa biết (về mặt lý thuyết) thành một mảng PHP tương đương.lặp qua cấu trúc XML không xác định bằng PHP (DOM)

Đây là XML mẫu của tôi:

<?xml version="1.0" encoding="UTF-8"?> 
<content> 

<title>Sample Text</title> 

<introduction> 
    <paragraph>This is some rudimentary text</paragraph> 
</introduction> 
<description> 
    <paragraph>Here is some more text</paragraph> 
    <paragraph>Even MORE text</paragraph> 
    <sub_section> 
     <sub_para>This is a smaller, sub paragraph</sub_para> 
     <sub_para>This is another smaller, sub paragraph</sub_para> 
    </sub_section> 
</description> 
</content> 

tôi sửa đổi DOM lặp chức năng này từ devarticles:

$data = 'path/to/xmldoc.xml'; 
$xmlDoc = new DOMDocument(); #create a DOM element 
$xmlDoc->load($data); #load data into the element 
$xmlRoot = $xmlDoc->firstChild; #establish root 

function xml2array($node) 
    { 
    if ($node->hasChildNodes()) 
    { 
$subNodes = $node->childNodes; 
    foreach ($subNodes as $subNode) 
     { 
     #filter node types 
     if (($subNode->nodeType != 3) || (($subNode->nodeType == 3))) 
      { 
      $arraydata[$subNode->nodeName]=$subNode->nodeValue; 
      } 
     xml2array($subNode); 
     } 
     } 
     return $arraydata; 
    } 
//The getNodesInfo function call 

$xmlarray = xml2array($xmlRoot); 


// print the output - with a little bit of formatting for ease of use... 
foreach($xmlarray as $xkey) 
    { 
    echo"$xkey<br/><br/>"; 
    } 

Bây giờ, vì cách tôi đi qua các yếu tố để các mảng tôi m ghi đè bất kỳ phần tử nào chia sẻ tên nút (vì tôi lý tưởng muốn cung cấp cho các khóa cùng tên với các nút gốc của chúng). Sự đệ quy của tôi không phải là tuyệt vời ... Tuy nhiên, ngay cả khi tôi làm trống các dấu ngoặc - lớp thứ hai của các nút vẫn đang đến như là giá trị trên tầng đầu tiên (xem văn bản của nút mô tả).

Bất kỳ ai có ý tưởng nào về cách tôi có thể xây dựng tốt hơn điều này?

Trả lời

2

Bạn có thể được tốt hơn off chỉ snagging một số mã off the net

http://www.bin-co.com/php/scripts/xml2array/

/** 
    * xml2array() will convert the given XML text to an array in the XML structure. 
    * Link: http://www.bin-co.com/php/scripts/xml2array/ 
    * Arguments : $contents - The XML text 
    *    $get_attributes - 1 or 0. If this is 1 the function will get the attributes as well as the tag values - this results in a different array structure in the return value. 
    *    $priority - Can be 'tag' or 'attribute'. This will change the way the resulting array sturcture. For 'tag', the tags are given more importance. 
    * Return: The parsed XML in an array form. Use print_r() to see the resulting array structure. 
    * Examples: $array = xml2array(file_get_contents('feed.xml')); 
    *    $array = xml2array(file_get_contents('feed.xml', 1, 'attribute')); 
    */ 
    function xml2array($contents, $get_attributes=1, $priority = 'tag') { 
1

Bạn có thể quan tâm SimpleXML hoặc xml_parse_into_struct.

$ arraydata không được chuyển cho các cuộc gọi tiếp theo đến xml2array() cũng không phải là giá trị trả lại được sử dụng, vì vậy có "đệ quy của tôi không tốt ..." là đúng ;-)
Để thêm phần tử mới vào mảng hiện có bạn có thể sử dụng dấu ngoặc vuông trống, $ arr [] = 123; $ arr [$ x] [] = 123;

+0

tôi đã thực hiện một phương pháp mà qua mảng trở lại, nhưng tôi muốn tìm hiểu xem tại sao nó không nhìn thấy các nút tầng 2. Ngoài ra, làm thế nào để tiếp tục thêm rằng bộ cuối cùng của dấu ngoặc đơn trống trên một mảng chiều sâu chưa biết? – sunwukung

+0

Ý tôi là, bạn đã thấy kịch bản trong bài viết ở trên của bạn ... đó là một con thú! – sunwukung

Các vấn đề liên quan