代码之家  ›  专栏  ›  技术社区  ›  djskinner

如何在C#.NET 3.5中查询此XML文档

  •  0
  • djskinner  · 技术社区  · 15 年前

    我有以下格式的XML文档:

    <metadata>
          <item name="Name" type="xs:string" length="102"/>
          <item name="Email" type="xs:string" length="202"/>
    </metadata>
    <data>
        <row>
            <value>Daniel</value>
            <value>daniel@no-reply.com</value>
        </row>
        <row>
            <value>George</value>
            <value>george@no-reply.com</value>             
        </row>
    </data>
    

    列的顺序和数量可能会更改,因此仅假定//行/value[1]/text()始终保持“Name”是不够的。

    使用元数据名称查询文档以获取正确值的最佳方法是什么?

    4 回复  |  直到 15 年前
        1
  •  1
  •   Scoregraphic    15 年前

    就我个人而言,我会将这个输入(是plist吗?)转换成一个“真实”的XML文档,其中标记具有更好的名称(即元数据描述)。您可以通过使用xsl转换和自写样式表(如果需要可以提供帮助)来实现这一点。

    之后,您将拥有如下结构:

    <data>
      <row>
        <Name>Daniel</Name>
        <Email>daniel@no-reply.com</Email>
      </row>
      <row>
        <Name>George</Name>
        <Email>george@no-reply.com</Email>
      </row>
    </data>
    

    现在,使用 /data/row/Name 并用 XPathNavigator

        2
  •  1
  •   djskinner    15 年前

    <?xml version='1.0' ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
    <data>
        <xsl:for-each select="/doc/data/row">
        <row>
            <xsl:for-each select="./value">
            <xsl:variable name="cur" select='position()' />
            <xsl:element name="{/doc/metadata/item[$cur]/@name}">
                <xsl:value-of select="./text()" />
            </xsl:element>
            </xsl:for-each>
        </row>
        </xsl:for-each>
    </data>
    </xsl:template>
    </xsl:stylesheet>
    
        3
  •  0
  •   Neil    15 年前

    这和你正在做的很相似,只是一个很好的开始

    <cars xmlns="/carsSchema.xsd">
      <car age="5">
        <carId>1</carId>
        <brand>BMW</brand>
        <model>320i</model>
        <color paintType="metallic">Red</color>
      </car>
    
      <car age="2">
        <carId>2</carId>
        <brand>VW</brand>
        <model>Golf</model>
        <color paintType="matt">White</color>
      </car>
    [...]
    </cars>
    
    
    XDocument xmlDoc = XDocument.Load(currentDir + "\\Cars.xml");
    XNamespace ns = "/carSchema.xsd";
    
    var carInfo1 = from car in xmlDoc.Descendants(ns + "car")
                       select (string)car.Element(ns + "brand") + ": " + 
                              (string)car.Element(ns + "model");
    
        4
  •  0
  •   Filburt kukabuka    15 年前

    让我猜猜:您正在检索xml格式的cognos报告?

    我正要处理同样的问题,但我认为cognos支持为您的报告结果定义模式,因此您不必对其进行xsl转换。

    ...

    run.xslURL-指定要应用于报表的XSL样式表的位置。此参数的值是有效的URI。

    我还没有尝试过这个,但我需要像您一样转换报告结果。