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

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

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

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

Java

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

332閲覧

isEndElementで要素名が必要とエラー</>を受け付けない

beginJavaPlayer

総合スコア1

XML

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

Java

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2022/10/03 12:45

編集2022/10/04 02:58

質問:xml文書を読み取る際に</>を読み取れる様にしたい
(※</〇〇〇>ではなく、</>です)
事象:XMLStreamExceptionでexpected an element name
使用言語:Java
環境:Axis2,SOAP,tomcat,jdk1.8,spring,Eclipse

現在、ドキュメントリテラル型の通信を実装しております

基本的に下記の様にどんどんXMLのデータタグと比較してreader.next()で読み進めていく感じです。
if(reader.isStartElement()
&& new QName("http://〇〇〇〇〇","Test4").getLocalPart()
.equals(reader.getName().toString()))

しかし、恐らくisEndElement自体が</>を受け付けていない様に思われます。
打開策が思い浮かばず…

------【追記】------
どうやら </ までは認識していて、
その次に > がくるとexceptionをはいている様です。
つまり、要素無しだからですね。

実現したい事は、
終了タグ</>で通信する事です

以下、使用リソース

xml

1<SampleData> 2 <DataOpe> 3 <Test1>TestRequest</> 4 <Test2> 5 <Test3>TestBody1</> 6 <Test4>TestBody2</> 7 </Test2> 8 </DataOpe> 9</SampleData>

抜粋してもかなりコードが多くなってしまうので結構割愛しております

Java

1 2public static Test2 pase(XMLStreanReader reader){ 3 4Test2 obj = new Test2(); 5QName qname = null; 6String prefix = ""; 7String namspaceuri = ""; 8 9while(!reader.isStartElement() && !reader.isEndElement()) reader.net(); 10qname = reader.getName(); 11 12if(reader.getAttributeValue("http://www.w3.org/2001/XMLSchema-instance", "type") != null){ 13 String fullTypeName = 14 reader.getAttributeValue("http://www.w3.org/2001/XMLSchema-instance", "type") ; 15 if(fullTypeName != null){ 16 String nsPrefix = null; 17 if(fullTypeName.indexOf(":") > -1){ 18 nsPrefix = fullTypeName.substring(0, fullTypeName.indexOf(":")); 19 } 20 nsPrefix = nsPrefix == null ? "" : nsPrefix ; 21 String type = fullTypeName.substring(fullTypeName.indexOf(":")+1) 22 if(!"Test2".equals(Type)){ 23 …割愛 24 } 25  reader.next(); 26 while(!reader.isStartElement() && !reader.isEndElement()) reader.net(); 27 28 if(reader.isStartElement() 29 && new QName("http://〇〇〇〇〇","Test4").getLocalPart() 30 .equals(reader.getName().toString())){ 31 …割愛 32 reader.next(); 33 } 34 while(!reader.isStartElement() && !reader.isEndElement()) reader.net(); 35 36 if(reader.isStartElement() 37 && new QName("http://〇〇〇〇〇","Test3").getLocalPart() 38 .equals(reader.getName().toString())){ 39 40 …割愛 41 reader.next(); 42 } 43 while(!reader.isStartElement() && !reader.isEndElement()) reader.net(); 44 } 45} 46} 47

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

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

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

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

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

jimbe

2022/10/03 14:57

</> って何でしょう。 XML では終了タグは </〇〇〇> だけだと思いますが。
beginJavaPlayer

2022/10/04 01:31

いえ、記述している通り、使う終了タグは</>です。 それで何とか実装しなければなりません。
jimbe

2022/10/04 03:53

実装しなけらばと言ってもそれは使う側の勝手な要望で、XML で無いモノを XML のパーサで扱おうというのは、パーサ側からすれば想定する訳は無いと思います。 XMLStreanReader に終了タグを省略した形を有効にする設定でもあれば簡単ですが、無ければ、 XML 処理の前に文字列編集として終了タグを XML に沿うように書き換えるとか、 有るか知りませんが SGML のパーサを探すとかが必要で、現状 pase メソッド (parse ?) だけでどうにかしようというのは無理でしょう。
beginJavaPlayer

2022/10/05 05:52

ありがとうございます。 自分の実現したい事を記載しております。 私1人では方法が思い浮かばないので「具体的な方法」を教えて頂ければ嬉しいです。
beginJavaPlayer

2022/10/05 05:53

なので、特に、 parseメソッドだけでどうにかしたい、 とは実現したい事に記載してはいないです。
jimbe

2022/10/05 16:39 編集

とにかく xml (と言われている xml ではない)ファイルを読むとして、どのような結果が出せればとお考えでしょうか。 例えば、実行すると /SampleData/DataOpe/Test1:TestRequest /SampleData/DataOpe/Test2/Test3:TestBody1 /SampleData/DataOpe/Test2/Test4:TestBody2 と表示されるようなサンプルが出来れば OK とか。
guest

回答1

0

ベストアンサー

ご提示頂いているコードに拘らなくても良いようですので、pase の内容は反映していません。
readImXML で前処理として "</>" を正常な終了タグに置き換えています。

Main.java

java

1import java.io.IOException; 2import java.io.StringReader; 3import java.nio.file.Files; 4import java.nio.file.Paths; 5import java.util.*; 6import java.util.regex.Matcher; 7import java.util.regex.Pattern; 8 9import javax.xml.stream.*; 10 11public class Main { 12 public static void main(String[] args) throws IOException, XMLStreamException { 13 String xml = readImXML("test_xml.txt"); 14 XMLInputFactory factory = XMLInputFactory.newInstance(); 15 parse(factory.createXMLStreamReader(new StringReader(xml))); 16 } 17 18 static final Set<String> targets = new HashSet<String>(Arrays.asList( 19 "Test1","Test3","Test4" 20 )); 21 22 static void parse(XMLStreamReader reader) throws XMLStreamException { 23 Hierarchy hierarchy = new Hierarchy(); 24 boolean processing = false; 25 while(reader.hasNext()) { 26 switch(reader.next()) { 27 case XMLStreamConstants.START_ELEMENT: 28 hierarchy.add(reader.getName().getLocalPart()); 29 if(targets.contains(reader.getName().getLocalPart())) { 30 System.out.print(hierarchy + ":"); 31 processing = true; 32 } 33 break; 34 case XMLStreamConstants.CHARACTERS: 35 if(processing) { 36 System.out.println(reader.getText()); 37 } 38 break; 39 case XMLStreamConstants.END_ELEMENT: 40 hierarchy.remove(); 41 processing = false; 42 } 43 } 44 } 45 46 static class Hierarchy { 47 private List<String> list = new ArrayList<String>(); 48 void add(String element) { 49 list.add(element); 50 } 51 void remove() { 52 list.remove(list.size()-1); 53 } 54 @Override 55 public String toString() { 56 StringJoiner sj = new StringJoiner("/", "/", ""); 57 for(String element : list) sj.add(element); 58 return sj.toString(); 59 } 60 } 61 62 static String readImXML(String filename) throws IOException { 63 StringBuilder out = new StringBuilder(); 64 String in = Files.readString(Paths.get(filename)); 65 Pattern p = Pattern.compile("<([A-Za-z0-9]+)( [^>]*)?>[^<]*(</>)"); 66 Matcher m = p.matcher(in); 67 int i = 0; 68 while(m.find(i)) { 69 out.append(in.substring(i, m.start(3))); 70 out.append("</").append(m.group(1)).append(">"); 71 i = m.end(); 72 } 73 out.append(in.substring(i)); 74 return out.toString(); 75 } 76}

test_xml.txt (提示されたデータ)

plain

1<SampleData> 2 <DataOpe> 3 <Test1>TestRequest</> 4 <Test2> 5 <Test3>TestBody1</> 6 <Test4>TestBody2</> 7 </Test2> 8 </DataOpe> 9</SampleData>

実行結果

plain

1/SampleData/DataOpe/Test1:TestRequest 2/SampleData/DataOpe/Test2/Test3:TestBody1 3/SampleData/DataOpe/Test2/Test4:TestBody2

投稿2022/10/05 11:22

編集2022/10/05 11:28
jimbe

総合スコア12612

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問