投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/9/1 00:39:34
「どういう結果を得たいのか」は説明されているのですが、
肝心の「どの部分の情報を取得したいのか」の説明が不足しているようで…。


> ●ID要素は属性のみなので値としてはString.Emptyが欲しい

ID 要素は空要素では無いですよね。
ここでいう『値』とは何を指していますか?


とりあえず、ID 要素の直下にある Text ノードのみを得たいという意味で良いでしょうか?

もしそれで構わないなら、直下の XText を繋げてみるのは如何でしょう。たとえば
Dim value = String.Join("", element1.Nodes().OfType(Of XText)().Select(Function(n) n.Value))

とすることができます。
(このままだと冗長的なので、実際に使う時は拡張メソッドにしておいた方が良いかも)

ただし、元の空白を保持させておいた場合には、
改行や空白を含んだ文字列になりえることにご注意ください。



> Dim element1 As XElement = Doc.<Root>.<ID>.First
> Console.WriteLine(String.Format("タグ名:{0}       値:{1}", element1.Name, element1.Value))

ということで、空白の扱いについて。

───────
今回は埋め込みの XDocument リテラルで記述しておられるようなので、
一部の改行やインデント空白が破棄され、element1 は下記の内容になります。

『<ID id="1">
  <Name>山田太郎
                    <Age>40</Age></Name>』



element1.Attributes().Count() は『1』を返します。
element1.Attributes()(0) は Attribute ノード『id="1"』を返します。

element1.Nodes().Count() は 『1』 を返します。
element1.Nodes()(0) は Element ノードです。これは element2 変数が示す XElement にあたります。

element2 には、下記の Element ノードが入ります。
『<Name>山田太郎
                    <Age>40</Age></Name>』


そして上記の element2 は、直下に 2 つの子ノードを持っています。
Text ノード『山田太郎{改行}␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣』
Element ノード『<Age>40<Age>』
が得られるという想定です。


この場合、直下の XTextのみを拾って繋げると、
element1 からは『』すなわち String.Empty
element2 からは『山田太郎{改行}␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣』
が得られるという想定です。


───────
もしも XDocument が LoadOptions.PreserveWhitespace 指定で読み込まれていた場合、
上記の element1 には下記の Element ノードが入ることになります。

『<ID id="1">
               <Name>山田太郎
                    <Age>40</Age>
               </Name>
           </ID>』


element1.Attributes().Count() は『1』を返します。
element1.Attributes()(0) は Attribute ノード『id="1"』を返します。

element1.Nodes().Count() は 『3』 を返します。
element1.Nodes()(0) は Text ノード『{改行}␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣』を指します。
element1.Nodes()(1) は Element ノードです。これは element2 変数が示す XElement にあたります。
element1.Nodes()(2) は Text ノード『{改行}␣␣␣␣␣␣␣␣␣␣␣』を指します。

element2 には、下記の Element ノードが入ります。
『<Name>山田太郎
                    <Age>40</Age>
               </Name>』


そして上記の element2 は、直下に 3 つの子ノードを持っています。
Text ノード『山田太郎{改行}␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣』
Element ノード『<Age>40<Age>』
Text ノード『{改行}␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣』


この場合、直下の XTextのみを繋げると、
element1 からは『{改行}␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣{改行}␣␣␣␣␣␣␣␣␣␣␣』
element2 からは『山田太郎{改行}␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣{改行}␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣』
が得られるという想定です。