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

时间:2009-12-09 14:24:10

标签: c# xml xpath

我有一个以下形式的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>

列的排序和数量可能会发生变化,因此仅假设//行/值[1] / text()始终保持“名称”是不够的。

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

我在C#.NET3.5中查询文档,因此可以使用XDocument,XPath等......无论哪个最适合这项工作。

4 个答案:

答案 0 :(得分:1)

就个人而言,我会将这个输入(它是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

选择节点很容易

答案 1 :(得分:1)

这个中间样式表是我尝试回应Scoregraphic的建议(我发布了可读性答案):

<?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>

答案 2 :(得分:0)

这与你正在做的相似,只是一个好的起点

<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");

答案 3 :(得分:0)

让我猜一下:你正在检索一个xml格式的认知报告?

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

...

我翻了几下,在官方的Cognos查看器文档中找到了以下url参数选项:

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

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