2

我正在尝试获取所有<Opening>标签的<PlanarGeometry>数量<Polyloop>> CartesianPoint4。

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 只选择存在子元素的节点?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]]

gb前缀需要映射到http://www.gbxml.org/schema命名空间 URI 。这将选择Opening包含至少一个Polyloop具有 4 个以上CartesianPoint子级的所有元素。

于 2013-01-22T12:13:42.560 回答
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 回答
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 回答