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

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

新規登録して質問してみよう
ただいま回答率
85.50%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

XPath(XML Path)

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

XMLパーサ

XML文書のテキストデータだけを抜き出して、アプリケーションソフトが利用しやすい形式に変換させるソフトウェアをXMLパーサと呼びます。

Q&A

解決済

1回答

1959閲覧

XPathの評価式で、タグが存在していない場合と存在しているが値が空の場合の区別をつけたい

sacakoro

総合スコア35

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

XPath(XML Path)

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

XMLパーサ

XML文書のテキストデータだけを抜き出して、アプリケーションソフトが利用しやすい形式に変換させるソフトウェアをXMLパーサと呼びます。

0グッド

1クリップ

投稿2018/06/28 07:27

JavaでXMLファイルを読み込み、XPathでXMLファイルの値を取得するプログラムを書いています。
・当該タグが存在していない場合
・当該タグが存在しているが値が空の場合
は区別つけることができるでしょうか。

例えば、以下のプログラムで、以下のXMLファイルを読み込ませた時、
/Control/bClass/text()
/Control/cClass/text()
の二つのXPathの評価式は同じ挙動をしているように見えます。
cClassタグが存在しないから例外を投げる、といったような挙動は作れないのでしょうか。

Java

1import javax.xml.parsers.DocumentBuilder; 2import javax.xml.parsers.DocumentBuilderFactory; 3import javax.xml.xpath.XPath; 4import javax.xml.xpath.XPathConstants; 5import javax.xml.xpath.XPathFactory; 6 7import org.w3c.dom.Document; 8 9 10public class Sample2 { 11 12 public static void main(String args[]) { 13 14 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 15 XPathFactory afactory; 16 try { 17 DocumentBuilder documentBuilder = factory.newDocumentBuilder(); 18 Document document = documentBuilder 19 .parse("/Users/(User name)/Desktop/hogehoge.xml"); 20 21 afactory = XPathFactory.newInstance(); 22 XPath xpath = afactory.newXPath(); 23 24 String a = (String) xpath.evaluate("/Control/aClass/text()", document, XPathConstants.STRING); 25 String b = (String) xpath.evaluate("/Control/bClass/text()", document, XPathConstants.STRING); 26 String c = (String) xpath.evaluate("/Control/cClass/text()", document, XPathConstants.STRING); 27 28 System.out.println(a); 29 System.out.println(b); 30 System.out.println(c); 31 32 33 } catch (Exception e) { 34 e.printStackTrace(); 35 } 36 } 37 38}

XML

1<?xml version="1.0" encoding="UTF-8"?> 2<Control> 3<aClass>TY</aClass> 4<bClass /> 5</Control>

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

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

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

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

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

guest

回答1

0

ベストアンサー

ノード自体の存在確認は明示的に行う必要があると思います。
下記のようなヘルパーメソッドで値を取り出すようにしたらいかがでしょうか。

Java

1// ヘルパーメソッド 2 private String getNodeText(XPath xpath, String expr, Document doc) throws Exception { 3 Node node = (Node) xpath.evaluate(expr, doc, XPathConstants.NODE); 4 if (node == null) { 5 throw new Exception("Node " + expr + " not exists."); 6 } 7 return node.getTextContent(); 8 } 9 10// 呼び出し側 11 public static void main(String args[]) { 12 13 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 14 XPathFactory afactory; 15 try { 16 DocumentBuilder documentBuilder = factory.newDocumentBuilder(); 17 Document document = documentBuilder 18 .parse("/Users/(User name)/Desktop/hogehoge.xml"); 19 20 afactory = XPathFactory.newInstance(); 21 XPath xpath = afactory.newXPath(); 22 23 String a = this.getNodeText(xpath, "/Control/aClass", document); 24 String b = this.getNodeText(xpath, "/Control/bClass", document); 25 String c = this.getNodeText(xpath, "/Control/cClass", document); 26 27 System.out.println(a); 28 System.out.println(b); 29 System.out.println(c); 30 31 32 } catch (Exception e) { 33 e.printStackTrace(); 34 } 35 }

投稿2018/06/28 08:10

tkanda

総合スコア2425

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

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

sacakoro

2018/07/09 01:49

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問