問題タブ [woodstox]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
jackson - Jackson XmlMapper() で名前空間を指定する方法
XML に解析する必要がある POJO があります。私はJackson 2.10を使用しています。
オブジェクトを渡し、次のように解析します。
私の出力には xmlns:wstxnsl があります。xmlns:xsi の後に xsi:type"" を付けたいと思います。
これは、woodstox がデフォルトで使用されているためだと思います。私はそれを変更する必要があります。
ジャクソンでこれを実現するには、何をする必要がありますか?
望ましい出力:
実際の出力
java - XML ファイルを CSV に変換する必要がありますが、ファイルを一度だけ読み取る必要があり、レコード タグのヘッダーが変更される可能性があります。
非常に大きな XML ファイルがいくつかあります。それらを解析して関連データを csv ファイルに抽出し、基本的に XML ドキュメントに対して部分的なフラット化を実行する必要があります。XML ファイルには、すべてのレコードが格納される「records タグ」があります。たとえば、次のようになります。
ここでのレコード タグは「person」であり、結果の CSV への変換は次のようになります。
これは間違っているかもしれません-私はすぐに入力しました-しかし、あなたはその考えを理解します.
留意すべき制約がいくつかあります。
- ファイルが非常に大きい (1 GB 以上) ため、これをメモリにロードできません。
- これは一度だけ読むべきです。
- (明らかに) データが失われたり、間違っていたりすることはありません。
さて、私は現在、レコードを含むタグである「ROWTAG」を指定して、単純な XML ファイルを csv に変換するパーサーを持っています (person
この例では)。ここで見ることができます。
しかし、それにはいくつかの制限があります。それらのほとんどを修正/対処する方法は知っていますが、制約を破らないと理解できないものが2つあります。
- パーサーの実装方法に基づいて、タグの順序が重要になります。次のような xml ファイルがあるとします。
最初のレコード タグのミドルネームは 2 番目になり、2 番目のレコードのミドルネームは 3 番目になります。これにより、次のような CSV ファイルが生成されます。
マイケルの名前は、Michael Rose Jordan であるはずなのに、Michael Jordan Rose として記録されました。
- 属性が追加、削除、または変更された場合、プログラムはそれを反映しません。これは、プログラムが最初のレコード要素のタグだけを見て、次の要素のタグを気にしないためです (例 1 で示したように)。
次の例を見てみましょう。
結果の CSV は次のようになります。
もちろん、これは大きな問題であり、解決しなければなりません。
私のような解決策
解決策に入る前に、プログラムが正確にどのように機能するかを簡単に要約します。パーサーは XML ドキュメントを移動し、タグに遭遇するたびにそれを私のプログラムに返します。私のプログラムには、説明したように、プログラムが検索する「rowTag」があります。これが検出されると、プログラムはこの rowTag 内のすべてのタグと値を調べ始め、それらを StringBuilder 内に保存します。終了rowTagに遭遇すると、その情報をダンプします。最初の反復中に、遭遇したすべてのヘッダーも保存し、終了タグに到達するとレコードの値をダンプする前に、最初にヘッダーをダンプします。
さて... 前述したように、これは順序の保存と、タグの変更、削除、または追加に問題を引き起こします。注文を解決するソリューションがあり、ヘッダーが更新されない問題を解決する必要がありますが、私のユースケースに適しているかどうかはわかりません (理由はすぐに説明します)。
私の考えは、タグの値とそれらが時間の経過とともに遭遇する順序を収集するハッシュマップのようなものを持つことです。キーはタグの値になり、値はタグが最初に出現した順序になります。
プログラムに沿って移動しながらレコードを収集するとき、必要な正しい場所にあるハッシュマップと同じ大きさの配列にそれらを配置します。新しいタグに遭遇した場合、単純に配列のサイズを変更し、現在遭遇した順序の値ではなく (何かを上書きする可能性があるため)、前の要素の値 + 1 (これは順序付けられたハッシュマップになるので、前の要素が何であるかがわかります)。
プログラムが完全に終了したら、収集したヘッダーをファイルの最初の行にダンプします。
それでは、最初の例を見てみましょう。
初めて実行した後のハッシュマップは次のようになります。
{firstname: 0, middlename: 1, lastname: 2}
ミドルネームとラストネームの位置が入れ替わっている 2 番目のレコードに到達したら、array[2]
ラストネームをスポットに配置し、ミドルネームをarray[1]
スポットに配置します。
何か不足している場合、たとえば次のようになります。
2 回目の実行中、配列は 2 番目の値で null になり (ミドルネームがそこにないため)、空の文字列に変換され、通常のようにカンマが追加されます。
興味深い部分は、何かが追加されたときです。
これにより、次のような CSV が生成されます。
,
最初の列には の後に余分なものはありませんがSmith
、それは有効な CSV ではありませんが、それで問題ないようです。涼しい。
とにかく - これで本当の問題が来ると思います。私は実際にJavaでbufferedreader/bufferedwriterを使用していません。もちろん、これらのファイルはすべてクラウド上にあり、ボンネットの下では基本的に API 呼び出しを停止しているため、Azure に付属のストリーム リーダー/ライターを使用しています。したがって、ヘッダーをファイルの最初の行にダンプできるとは思いません。とにかく、それが可能だったかどうかさえわかりません。
そう。アイデアを持っている天才はいますか?
stax - Woodstox - ドキュメントにルートがないときに END_DOCUMENT を書き込もうとしています
Woodstox を使用して XML を記述するのは初めてで、EndDocument を追加するとエラーが発生します。
私のコード:
エラー:
XML は次のように記述されます。
プロパティ P_OUTPUT_VALIDATE_STRUCTURE、P_OUTPUT_VALIDATE_CONTENT、P_OUTPUT_VALIDATE_NAMES、P_OUTPUT_VALIDATE_ATTR、P_OUTPUT_FIX_CONTENT を false にして検証を無効にしようとしましたが、次のエラーが発生します。
P_AUTOMATIC_END_ELEMENTS を無効にすると、最初のエラーが発生します。
私は何を間違っていますか?
java - Woodstox/XML1.1/XSD 解析 + 検証と XInclude
以下の Java/woodstox コードを手伝ってください。私の例では、xsd ファイルと 2 つの xml ファイルも提供しています。
主な問題
検証をオンにしましたが、検証エラーが発生することが予想されます。
- ID foo1 と foo2 は、test2.xml で 2 回定義されています。
- ID foo は、test2.xml で定義なしで使用されます (XInclude を使用して発生させたいので、test1.xml からの ID が考慮されない限り)。
- ID foo3 は、test2.xml で定義なしで使用されます。ただし、検証の問題は示されていません。
test.xsd
test1.xsd
test2.xsd
Java コード
代わりに試したこと
最初のステップとしてではSAXParserFactory saxParserFactory = WstxSAXParserFactory.newInstance();
なく、
使用したほうがよい
ですか?XMLInputFactory xmlInputFactory = XMLInputFactory2.newInstance();
違いはなんですか?
しかし、これ
saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage","http://www.w3.org/2007/XMLSchema-versioning");
ではSAXNotSupportedException
「指定されたスキーマ言語はサポートされていません」の設定時に問題が発生しました。結果。
少なくとも
xmlReader.setErrorHandler(new SimpleErrorHandler());
、上記のコードでは実行しなかったエラー ハンドラーをインストールするために使用できます。
アドオンの質問 1
私にとってどちらが良いですか:createXMLStreamReader
またはcreateXMLEventReader
?
アドオンの質問 2
XSD/XML ファイルを調整する必要はありますか? 特にヘッダー?
アドオンの質問 3
解析/検証の前に Xincludes を解決する必要がありますか? もしそうなら、どのように?
さらなる文脈
- 明らかに、コードは初期段階にあり、終了方法についてはあまり気にしません。
- 複数の ID 属性を持つ XML タグが必要なため、XML1.1 を使用します。
- XInclude を使用するのは、xml ファイルをモジュール方式で定義して、xml コードの重複を回避したいからです。
- Intellij は私のファイルを検証しないので、ここでもう少し深く掘り下げようとしていますが、ここでは検証の問題が発生しないのに対し、他のスレッドで問題が発生するため、問題は今のところ無関係であると想定しています
- Woodstox メーリング リストに (ほぼ同じ質問を) 投稿しましたが、ほとんど活動がありません。スレッド
java - XMLEventWriter が javax.xml.stream.XMLStreamException: No open start element をスローする
アプリケーションJSON -> XML
コンバーターがあります。このアプリケーションは、List
XML に 1 つずつ変換される一連のイベントを受け取ります。変換前に、メソッドを使用して最終的な XML のヘッダーが作成されstart
、後で変換されたイベントがxmlEventWriter
1 つずつ追加されます。最後に、すべての変換の後、end
メソッドを使用して終了タグが XML に追加されます。
タグを閉じる際に問題が発生し、次のエラーが発生します。
私の理解では、すべてが正しいのですが、まだ問題に直面している理由がわかりません。
header body and closure
以下は、 XML でタグを作成するクラスです。
この行のエラーが発生しています:
なぜこのエラーが発生するのかわかりません。タグを開いてBody
から閉じようとしています。フローは正しいと確信しています。 、 、そして最後に を呼び出してstart
いcollect
ますend
。に続いて、output
私は得ています:
タグEND END
でエラーが発生したため、取得できません。closing of Body
この問題を理解し、回避策とヘルプを提供してください。