2

の数が 4 を超えるすべての<Opening>タグを取得しようとしています。<PlanarGeometry><Polyloop>CartesianPoint

Xml タグ サーフェスは別の子です。

<Surface id="su-137" surfaceType="InteriorWall" constructionIdRef="ASHIW23" xmlns="http://www.gbxml.org/schema">
 <Name>W-106-114-I-W-137</Name>
 <Opening id="su-137-op-1" openingType="NonSlidingDoor" constructionIdRef="MDOOR">
 <Name>W-106-114-I-W-137-D-1</Name>
   <PlanarGeometry>
      <PolyLoop> 
         <CartesianPoint><Coordinate>55.570238</Coordinate><Coordinate>92.571596</Coordinate>
         <Coordinate>0.000000</Coordinate></CartesianPoint><CartesianPoint>         <Coordinate>55.570238</Coordinate><Coordinate>92.571596</Coordinate><Coordinate>6.666667</Coordinate>     
         </CartesianPoint>
         <CartesianPoint>
         <Coordinate>55.570238</Coordinate><Coordinate>95.571596</Coordinate><Coordinate>6.666667</Coordinate></CartesianPoint>
         <CartesianPoint>
         <Coordinate>55.570238</Coordinate><Coordinate>95.571596</Coordinate><Coordinate>0.000000</Coordinate>
        </CartesianPoint>
     </PolyLoop>
   </PlanarGeometry>
 </Opening>              
</Surface>

私はこれからほとんど参照を得ませんでした - Xpath to select only nodes where child elements exist? SOスレッドで、以下の例からほとんど助けが得られませんでした。

book[author/degree]
All <book> elements that contain <author> children that in turn contain at least one <degree> child.

xPathまたは別の方法を使用してこれを達成するにはどうすればよいですか???

4

4 に答える 4

2

CartesianPointの数が 4 を超えるすべての<Opening>タグを取得しようとしています。<PlanarGeometry><Polyloop>

Surface要素が現在のコンテキスト ノードであると仮定すると、次のようになります。

gb:Opening[gb:PlanarGeometry/gb:Polyloop[count(gb:CartesianPoint) > 4]]

プレフィックスは名前空間 URIgbにマップする必要があります。これにより、4 つ以上の子を持つ要素を少なくとも 1 つ含むhttp://www.gbxml.org/schemaすべての要素が選択されます。OpeningPolyloopCartesianPoint

于 2013-01-22T12:13:42.560 に答える
1

LINQ to XML を使用する場合は、次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    public class Program
    {
        public static void Main()
        {
            XElement sample = XElement.Load("c:\\sample.xml");
            IEnumerable<XElement> open_elements = sample.Descendants().Where(c => c.Name.LocalName == "Opening").Where(c => c.Descendants().Where(d => d.Name.LocalName == "CartesianPoint").Count() > 4);
            foreach (XElement ele in open_elements){
                Console.Write(ele.Attribute("id"));
            }
            Console.ReadKey();
        }
    }
}

お役に立てれば。

于 2013-01-23T07:24:58.513 に答える
1

次の XPath が機能するはずです。

//g:Opening[4<count(./g:PlanarGeometry/g:PolyLoop/g:CartesianPoint)]

Surfaceタグには名前空間があるため、名前空間プレフィックスを使用することに注意してください。私は C# についてあまり知りませんが、使用する前にプレフィックスを登録する必要があるでしょう。

于 2013-01-22T12:13:34.370 に答える
1

これを試してください:

/gb:Surface/gb:Opening[count(gb:PlanarGeometry/gb:PolyLoop/gb:CartesianPoint) > 4]

ここに示すように、XML は名前空間を使用するため、その名前空間を XPath エンジンに宣言し、プレフィックスで参照する必要があります。である必要はありませんがgb、何かでなければなりません。

于 2013-01-22T12:13:57.750 に答える