1

私は、ええと、道に迷ったようです。

私の問題は、PHPDOMDocumentクラスを正しく解析することにあると思います。

さまざまな列のヘッダーを持つ Excel からの XML スプレッドシートがあります。(エンド ユーザーがデータを整理するのに役立つ複数のワークシートもあります。)

私の最終目標は、JavaScript を利用した地図上のマーカーです。

XML ファイルの簡単な例を次に示します。 注: データには、文字列、数値、HTML のデータがあります。

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook>
 <Worksheet ss:Name="data">
  <Table>
   <Row>
    <Cell><Data ss:Type="String">lat</Data></Cell>
    <Cell><Data ss:Type="String">lng</Data></Cell>
    <Cell><Data ss:Type="String">boolean_1</Data></Cell>
    <Cell><Data ss:Type="String">boolean_2</Data></Cell>
    <Cell><Data ss:Type="String">Source_documents</Data></Cell>
    <Cell><Data ss:Type="String">description</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="Number">35.032139998</Data></Cell>
    <Cell><Data ss:Type="Number">-117.346952</Data></Cell>
    <Cell><Data ss:Type="Number">1</Data></Cell>
    <Cell><Data ss:Type="Number">0</Data></Cell>
    <Cell><ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40"><Font html:Color="#000000">Copy here inside HTML </Font><I><Font html:Color="#000000">with more copy</Font></I></ss:Data></Cell>
    <Cell><Data ss:Type="String">Copy here without HTML</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="Number">43.444</Data></Cell>
    <Cell><Data ss:Type="Number">-112.005</Data></Cell>
    <Cell><Data ss:Type="Number">1</Data></Cell>
    <Cell><Data ss:Type="Number">1</Data></Cell>
    <Cell><Data ss:Type="String">Diff Marker Src</Data></Cell>
    <Cell><Data ss:Type="String">Diff Marker Desc</Data></Cell>
   </Row>
  </Table>
 </Worksheet>
 <Worksheet ss:Name="tags">
  <Table>
   <Row>
    <Cell><Data ss:Type="String">tag_label</Data></Cell>
    <Cell><Data ss:Type="String">tag_category</Data></Cell>
    <Cell><Data ss:Type="String">tag_description</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">boolean_1</Data></Cell>
    <Cell><Data ss:Type="String">tag_cat_A</Data></Cell>
    <Cell><Data ss:Type="String">bool_1 desc</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">boolean_2</Data></Cell>
    <Cell><Data ss:Type="String">tag_cat_B</Data></Cell>
    <Cell><Data ss:Type="String">bool_2 desc</Data></Cell>
   </Row>
  </Table>
 </Worksheet>
</Workbook>

私は、スプレッドシートを JSON 配列に変換するか、より構造化された XML ドキュメントに変換して、マップのマーカーを作成するために解析できるようにする必要があると考えてきました。(JSONは転送されるデータを減らすために好ましいようです)

その仮定が正しければ、次のような構造にしたいと思います。

array => {
  data => {
    [0] => {
        lat => '35.032139998',
        lng => '-117.346952',
        booleans => {
            boolean_1 => true
        },
        Source_documents => '<Font html:Color="#000000">Copy here inside HTML </Font><I><Font html:Color="#000000">with more copy</Font></I>',
        'description' => 'Copy here without HTML'
    },
    [1] => {
        lat => '43.444',
        lng => '-112.005',
        booleans => {
            boolean_1 => true,
            boolean_2 => true
        },
        Source_documents => 'Diff Marker Src',
        'description' => 'Diff Marker Desc'
    }
  },
  tags = {
    'boolean_1' => {
        tag_category => 'tag_cat_A',
        'tag_description' => 'bool_1 desc'
    },
    'boolean_2' => {
        tag_category => 'tag_cat_B',
        'tag_description' => 'bool_2 desc'
    }
  }
}

私はPHPで作業しており、DOMDocumentクラスを利用してXMLをJSONに変換しようとしています。SimpleXML は、ときどき HTML を含む新しい Excel ドキュメントが読み込まれるまで、問題なく機能しました。

これまでのところ、このPHPコードがあります:

function get_worksheet_table($file, $worksheet_name) {
  $dom = new DOMDocument;
  $dom->load($file);

  // returns a new instance of class DOMNodeList
  $worksheets = $dom->getElementsByTagName( 'Worksheet' );

  foreach($worksheets as $worksheet) {

    // check if right sheet
    if( $worksheet->getAttribute('ss:Name') == $worksheet_name) { 

      // trying to get entire node, or childNodeList, or ... ?
      // About here I am getting lost.
      $nodes = $worksheet->getElementsByTagName('Table')->item(0); 

      $table = new DOMDocument;
      $table->preserveWhiteSpace = false;
      $table->formatOutput = true;
      $table->createElement('Table');

      /*
         ITERATE THROUGH $nodes, ADD EACH CELL NODE'S CONTENTS 
         TO $table -- UNLESS IT HAS HTML, THEN USE DOMinnerHTML(node) 
         (DOMinnerHTML function @ http://php.net/manual/en/book.dom.php#89718)
       */

      return $table;
    }
  }
  return false;
}

$data = get_worksheet_table($file, 'data');
$tags = get_worksheet_table($file, 'tags');

そこから、$data と $tags から連想配列を作成し、アプリケーションに渡す大きな JSON ステートメントを出力しようとしています。

しかし、それは本当に混乱していて、私が言ったように、私は迷っています。

質問:

  1. これは、少なくとも正しい軌道に乗っているように見えますか?
  2. ノードに適切にアクセスするにはどうすればよいですか?—すべてのサブノードを 1 つの大きなテキスト値として取得しているようです。
  3. DOM を繰り返し処理して、必要に応じてセルのテキスト コンテンツにアクセスし<data>、子ノードではなく文字列としてノードの子にアクセスするにはどうすればよいですか?

DOMDocument クラスを解析する方法をよりよく理解するためのヒントをいただければ幸いです。私はドキュメントを読み続けていますが、それは私を逃れています。

お時間をいただきありがとうございました。

4

1 に答える 1