我有一个以下形式的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等......无论哪个最适合这项工作。
答案 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。
我还没有尝试过,但我需要像你一样转换报告结果。