質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1025閲覧

DOMXPathでXMLの特定のタグを抽出できない

maguzo

総合スコア57

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2019/05/10 07:02

編集2019/05/10 07:17

下記のようなDOMXpathで特定のタグを抽出したいのですが、ix:nonNumericタグが取得できません。 $xpath->query('//h1');であれば正しく取得されるのですが、このようにXMLの特殊なタグはDOMXpathでは取得できないのでしょうか?
うまく取得する方法があればアドバイスをください。
宜しくお願いいたします。

php

1<?php 2$url="http://xxx"; 3$html=file_get_contents($url); 4 5$dom = new DOMDocument('1.0', 'UTF-8'); 6$html = mb_convert_encoding($html, "HTML-ENTITIES", 'auto'); 7@$dom->loadHTML($html); 8$xpath = new DOMXPath($dom); 9$xpath->registerNamespace("php", "http://php.net/xpath"); 10$xpath->registerPHPFunctions(); 11 12$xi = $xpath->query('//ix:nonNumeric'); 13var_dump($xi); 14

XML

1http://xxxの中身 2 3<?xml version="1.0" encoding="utf-8"?> 4<html version="-//XBRL International//DTD XHTML Inline XBRL 1.0//EN" xmlns="http://www.w3.org/1999/xhtml" xmlns:ix="http://www.xbrl.org/2008/inlineXBRL" xmlns:ixt="http:/ 5<!--中略--> 6<h1>3.FS</h1><ix:nonNumeric name="jpsps_cor:BalanceSheetTextBlock" contextRef="CurrentYearDuration" escape="true"><h2>(1)貸借対照表</h2><div><table style="table-layout: fixed; width: 647.989990234376px" cellpadding="0" cellspacing="0"><colgroup><col style="width: 7<!--後略-->

また、Xpathではなくとも通常のDOM操作でもこのようなタグを拾えません、、
XMLで使用されるような特殊なタグは取得できないのでしょうか。。。

php

1$dom = new DOMDocument('1.0', 'UTF-8'); 2$dom->preserveWhiteSpace = false; 3$dom->formatOutput = true; 4$dom->load($url); 5 6$root = $dom->getElementsByTagName("ix");//ix:nonNumericでもだめです 7var_dump($root);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ockeghem

2019/05/10 12:45

XMLの例が中途半端でちぎれているので、差支えのない範囲で、ちぎれていないデータを提示ください。また、XMLと言われている割には、html要素で始まっていますが、このようなデータなのですか?
maguzo

2019/05/13 00:14

コメントありがとうございます。 有報キャッチャーというAPIから提供されているデーターなのですが、 生のソースはこちらです。http://resource.ufocatch.com/xbrl/tdnet/TD2019021500159/XBRLData/Attachment/0101010-arbs01-tse-anrejpfr-89510-2018-12-31-01-2019-02-15-ixbrl.htm 私もあまり明るくなくて申し訳ないのですが、ソースコードを見ると、xmlから始まるのですが 実際にはHTMLで記載されているように思われます。 たまにこういうコード(文頭XMLタグからスタートするにもかかわらず、実際は違う)を見かけるのですが、実際にはHTMLと思われます。ただし、中の要素を見るとHTMLにはないxiの様なタグもあるので、混合型ということなのでしょうか。。 宜しくお願い申し上げます。
guest

回答2

0

ベストアンサー

コメントにて提示いただいたXMLはインラインXBRLというものですね。
質問のソースは、いかにもコピペという感じで、不要なコートが多く含まれていました。不要なものを削除し、修正をほどこしたところ、以下のような形で読み込めるようです。
ix:nonNumeric の部分は、XMLの名前空間というものを使った表記です。

PHP

1<?php 2$url = "http://resource.ufocatch.com/xbrl/tdnet/TD2019021500159/XBRLData/Attachment/0101010-arbs01-tse-anrejpfr-89510-2018-12-31-01-2019-02-15-ixbrl.htm"; 3$html = file_get_contents($url); 4$dom = new DOMDocument('1.0', 'UTF-8'); 5@$dom->loadXML($html); 6 7$xpath = new DOMXPath($dom); 8$xpath->registerNamespace("ix", "http://www.xbrl.org/2008/inlineXBRL"); 9$xi = $xpath->query('//ix:nonNumeric'); 10 11//var_dump($xi); 12foreach ($xi as $element) { 13 var_dump($element); 14}

投稿2019/05/13 09:30

ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maguzo

2019/05/13 22:43

コメント有難うございます! 名前空間を登録する関数のregisterNamespaceについて、マニュアルをみても分からなかったのですが、第2引数の"http://www.xbrl.org/2008/inlineXBRL"はどこから引用されている、または何を引用すべきなんでしょうか? 重ねて申し訳ございませんが、宜しくお願い申し上げます。
maguzo

2019/05/14 04:36

有難うございます! とても助かりました。
guest

0

XPathなんて使ったことないが、以下でできるようだぞ

foreach ($dom->getElementsByTagNameNS('namespace', '*') as $element) { echo 'local name: ', $element->localName, ', prefix: ', $element->prefix, "\n"; } ```localNameがnonNumericでprefixがixになるようだぞ 必要なものをifで判定して取るしかないな https://www.php.net/manual/ja/domdocument.getelementsbytagname.php https://www.php.net/manual/ja/domdocument.getelementsbytagnamens.php

投稿2019/05/12 23:44

bcaa

総合スコア170

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maguzo

2019/05/13 22:45

コメント有難うございます。名前空間の接頭辞だったのですね。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問