Java StAXを使用してXML処理命令をフォーマットして読み取るにはどうすればよいですか?
質問
まず、XML処理命令をフォーマットするにはどうすればよいですか:
<?processingInstructionName attribute="value" attribute2="value2"?>
StAXを使用して、 XMLStreamConstants.PROCESSING_INSTRUCTION
( javadoc )イベント。ただし、 XMLStreamReader
から処理命令に関する情報を取得する2つのメソッドのみを提供します。 :
getPITarget()
getPIData()
javadoc これら2つの方法はあまり役に立ちません。
- XML形式は正しいですか?
- これは適切な方法ですか
解析処理命令
StAX
XMLStreamReader
を使用する API? -
getPITarget()
およびgetPIData()
を使用して複数の引数を返すにはどうすればよいですか>
解決
1。XMLのフォーマットは正しいですか?
はい、ただし 処理命令には属性 -データのみ。属性のように見えるものはデータの一部であり、一部の人々はそれらを&quot; pseudo-attributes
&quot;と呼びます。
2。これは、StAX XMLStreamReader APIを使用して処理命令を解析する適切な方法ですか?
はい。
3。getPITarget()およびgetPIData()を使用して複数の引数を返すにはどうすればよいですか?
「複数の引数」による場合データに含まれる可能性のある複数の擬似属性を意味します。答えは、コードでデータを解析する必要があるということです(C# split()
、およびすべての擬似の名前と値のペアのセットを取得-属性。
他のヒント
属性を持つ処理命令のこの概念は、いくつかの古いxmlマニュアルから来ていると思います。ある時点で、そのような構造化を尊重または要求するようPIに推奨することについての議論がありました。ただし、公式のxml仕様では、そのような使用法が義務付けられておらず、推奨されることもありません。
したがって、基本的には自分でコンテンツを解析する必要があります。どのような形式でもかまいませんが、属性表記を使用していることがわかっている場合は解析できます。
私が知る限り、残念ながらJava xmlパーサーまたは処理パッケージはいずれもこのような使用をサポートしていません。
Dimitreの答えは技術的には正しいものの、いくつかの一般的なライブラリは、処理命令の擬似属性を予想どおりに解析するようになりました。後続の例では、次のXML処理命令を解析して、 href
pseduo-attributeの値を取得します。
<?xml-stylesheet type="text/xsl" href="markdown.xsl"?>
JDOM2
JDOM2 :
import org.jdom2.ProcessingInstruction;
import org.xml.sax.helpers.DefaultHandler;
public class ProcessingInstructionHandler extends DefaultHandler {
@Override
public void processingInstruction( final String target, final String data ) {
final ProcessingInstruction pi = new ProcessingInstruction( target, data );
System.out.println( pi.getPseudoAttributeValue( "href" ) );
}
}
サクソン
Saxon :
import static net.sf.saxon.tree.util.ProcInstParser.getPseudoAttribute;
import org.xml.sax.helpers.DefaultHandler;
public class ProcessingInstructionHandler extends DefaultHandler {
@Override
public void processingInstruction( final String target, final String data ) {
System.out.println( getPseudoAttribute( data, "href" ) );
}
}