DOM Get first child XML element:valueがない場合にゴミデータが返ってくる

v18で確認しました。
DOM Get first child XML elementの第3引数の要素値を受け取る様にしていたのですが
要素値がない場合に、"\n \n \n \n \n "の様な値が返ってきます。
同じ値なら良いのですが、何かの影響を受けている様でいつも違う値になっています。

具体的な例を教えていただけないでしょうか。

<code 4D>
$xml:="\n\t\n\t\t\n\t\n"

$dom:=DOM Parse XML variable($xml)

$c:=DOM Find XML element($dom;“a/b/c”)
C_TEXT($name;$value)
$ref:=DOM Get first child XML element($c;$name;$value)

DOM CLOSE XML($dom)
</code 4D>

これでは再現しませんでした。

XMLの改行・空白文字については,いろいろな決まりがあるので,
文書の構造に左右される振る舞いが関係しているように思います。

こんな感じです。
[]33287387;“Your comment here…”[/]

内容はこちらです。
[]33287391;“Your comment here…”[/]

これはXMLの仕様上,正常な動作ではないでしょうか。

$xml:="\n\t\n\t\t\n\t\n"
$dom:=DOM Parse XML variable($xml)
$a:=DOM Find XML element($dom;“a”)
C_TEXT($value)
DOM GET XML ELEMENT VALUE($a;$value)
DOM CLOSE XML($dom)

この場合,の要素値は,の間にあるすべての空白文字(を除く)を指します。
つまり,\n\t\nです。

こうしてみて何となく理解できました。
可読しやすい様にスペースや改行を入れて整形している部分が返ってきているんですね。
[]33288747;“Your comment here…”[/]

これは除外できないものなのでしょうか? :frowning:

パーサーの機能を借りる必要がありそうです。

https://stackoverflow.com/questions/13946734/format-xml-file-in-c-or-qt

XML SET OPTIONSの_XML indentation_は,値の書き込みだけに効果があり,
読み取りには影響がない,とあります(v12までは両方できたような気がするのですが・・・)。

https://doc.4d.com/4Dv17R6/4D/17-R6/XML-SET-OPTIONS.301-4310749.ja.html

追記

LIBXML2のFAQページより

http://xmlsoft.org/FAQ.html#Developer

In XML all characters in the content of the document are significant including blanks and formatting line breaks.

XML文書の内容は,可読性を高めるために挿入されている空白文字や改行文字を含め,すべて有効で意味があるものです。

The extra nodes you are wondering about are just that, text nodes with the formatting spaces which are part of the document but that people tend to forget. There is a function xmlKeepBlanksDefault () to remove those at parse time, but that’s an heuristic, and its use should be limited to cases where you are certain there is no mixed-content in the document.

パーサーには,文書を解析する段階でこれらの文字を除去する関数が用意されていますが,ヒューリスティックな処理であり,文書の構造によってはうまくいかないことがあるかもしれないので,注意が必要です。

とりあえず,プラグインにしてみました:

https://miyako.github.io/2020/01/09/4d-plugin-xml-minify.html
https://github.com/miyako/4d-plugin-xml-minify/releases/tag/1.1

プラグインありがとうございます。後で確認してみます。

こちらでも色々検証した結果、
DOM Get first child XML elementで取得したエレメントに対して、
もう一度DOM Get first child XML elementを実行して子エレメントがある場合には、
valueの値はインデントなどのゴミだと判断できることに気がつきました。

XML SET OPTIONSのXML indentationも試してみましたが動作しませんでした。
調べてたらこんなの出てきました。
https://4d-jp.github.io/2019/06/26/xml-set-option/XMLのインデントが除去されるわけではない>
新規で作った場合のみ適用される様ですね。

: Keiji HOSAKA

取得したエレメントに対して、
もう一度DOM Get first child XML elementを実行して子エレメントがある場合

たとえば

1

のようなシンプルな構造は良いとしても,

1
23

のような場合,

つまり

1\n\t23\n

を整形したようなXMLの場合,値は"1\n\t3\n"とならないでしょうか。

: Keisuke MIYAKO

1
23

のような場合,

つまり

1\n\t23\n

を整形したようなXMLの場合,値は"1\n\t3\n"とならないでしょうか。

確かにこの様なデータの場合はダメですね。
ですがXMLでこの様なデータがあるのでしょうか?あまり見かけないのですが…

プラグイン試しました。
このプラグイン不要なインデントなどを排除するんですね。

XMLのParseするコマンドのオプションとしてあるといいですね。

: Keiji HOSAKA

確かにこの様なデータの場合はダメですね。
ですがXMLでこの様なデータがあるのでしょうか?あまり見かけないのですが…

思い出しました。SVGですね。すっかり失念してました。 :pray:

Macで使おうとしたのですが、プラグインが壊れているとメッセージが出ます。

[]33492261;“Your comment here…”[/]

macOS 10.15.2です。

プラグインはhttps://github.com/miyako/4d-plugin-xml-minify/releases/tag/1.1Releases>からダウンロードされたもの(.dmg)でしょうか。

リポジトリを単純にダウンロードした場合(緑色のClone or downloadボタン)署名等の情報は失われますので,GateKeeperにブロックされる可能性があります。あるMacでダウンロードし,別のMacにネットワーク経由で転送した場合も同様です(GateKeeperのホワイトリストはマシン間で共有されません)。

.dmgをダウンロードしたらうまく行きました。
署名の問題なんですね。だんだん面倒くさくなってきましたね。 :slight_smile: