0

重複の可能性:
Linq To Xml を理解する - 子孫は結果を返さない

だから私はマイクロソフトの例を見てきました:

http://msdn.microsoft.com/en-us/library/bb387061.aspx

そこで、彼らは次のようにします:

IEnumerable<string> partNos =
from item in purchaseOrder.Descendants("Item")
select (string) item.Attribute("PartNumber");

彼らは「子孫」を使用して、実際には 3 レベルの深さの purchaseOrder 内のアイテムに対処します。

さて、XML で同じことをしようとしても、何も得られません。

私のXML:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<name>Roulette</name>

<modules>
    <module>application</module>
    <module>test</module>
</modules>

私のコード:

XDocument mainPOM = XDocument.Load(above_xml);
List<string> pomLocations = (from loc in mainPOM.Descendants("module") select (string)loc.Name.LocalName).ToList();
Console.WriteLine(pomLocations.Count);

残念ながら、pomLocations の長さは 0 :(.

誰かが正確にどこを台無しにしているのか教えてもらえますか?

4

1 に答える 1

1

あなたのルート要素にはこれが含まれています:

xmlns="http://maven.apache.org/POM/4.0.0"

これは、子孫要素とそれ自体のデフォルトの名前空間を設定しています。したがって、要素の名前は単なる「プロジェクト」ではなく、その名前空間内の「プロジェクト」です。あなたがしたい:

XNamespace ns = "http://maven.apache.org/POM/4.0.0";
var locations = mainPOM.Descendants(ns + "project")
                       .Select(...);

Selectあなたが本当に望んでいるとは思わないので、句を「...」のままにしましloc.Name.LocalNameた。これは、クエリのおかげで常に「プロジェクト」になります。

Descendantsさらに、とにかくあなたが本当に欲しいのは明らかではありません -projectがルート要素である場合、単に使用しないのはなぜmainPOM.Rootですか?

于 2012-11-02T13:15:40.230 に答える