2009-12-09 43 views
0

我有以下形式的XML文檔:如何查詢該XML文檔中的C#.NET 3.5

<metadata> 
     <item name="Name" type="xs:string" length="102"/> 
     <item name="Email" type="xs:string" length="202"/> 
</metadata> 
<data> 
    <row> 
     <value>Daniel</value> 
     <value>[email protected]</value> 
    </row> 
    <row> 
     <value>George</value> 
     <value>[email protected]</value>    
    </row> 
</data> 

列的順序和數量可能會發生變化,因此不足以承擔//行/值[1]/text()總是包含'Name'。

什麼是使用元數據名稱來查詢文檔以提取正確值的最佳方式?

我在C#.NET3.5中查詢文檔,所以可以使用XDocument,XPath等......以最合適的工作爲準。

+0

這是** **不是一個有效的,良好的XML文檔 - 第一接地規則是:只有一個根元素 - 在這裏沒有這個...... – 2009-12-09 14:55:02

+0

它確實有一個根元素 - 我只是忽略了將它添加到示例中。 – djskinner 2009-12-09 15:13:09

回答

1

就個人而言,我會改變這個輸入(被它的plist?)到一個「真實」的XML文檔,其中標籤有更好的名字(即元數據描述)。你可以通過使用xsl轉換和一個自寫的樣式表來實現這一點(如果需要可以協助)。

之後,你就會有這樣的結構:

<data> 
    <row> 
    <Name>Daniel</Name> 
    <Email>[email protected]</Email> 
    </row> 
    <row> 
    <Name>George</Name> 
    <Email>[email protected]</Email> 
    </row> 
</data> 

現在則很容易與XPathNavigator

+0

它來自Cognos報告引擎,我無法控制格式。這可能是前進的方向,但我仍然需要了解如何在XSL中查詢原始文檔。我會進一步探討這個選項。 – djskinner 2009-12-09 15:05:30

+0

我回家後(大約一個小時)就會提供一個樣式表;) – Scoregraphic 2009-12-09 15:17:52

+0

我已經有了第一個樣式表(請參閱我自己的問題的答案)。它似乎與一些測試數據一起工作。這個中介式樣式表是最好的方式來處理它嗎? – djskinner 2009-12-09 15:53:05

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

解決使用/data/row/Name,並選擇它們的節點讓我猜:你檢索XML格式的Cognos報告?

我只是要處理同樣的問題,但我認爲Cognos支持爲報告結果定義架構,因此您不必xsl轉換它。

...

我翻遍了一下週圍,發現官方Cognos Viewer中文檔中的以下網址參數選項:

run.xslURL - 指定XSL樣式表的位置,以適用於報告。這個參數的值是一個有效的URI。

我還沒有嘗試過,但我需要像你一樣轉換報告結果。

+0

是的,但它是集成到SaaS產品中的Web API,我看不到配置輸出的任何方式(甚至不是Excel輸出) – djskinner 2009-12-09 15:06:40

+0

如果我可以通過上面的轉換來完成此操作,那將很方便,但我只能訪問非常基本的基於Web的查詢工作室,無法指定此選項。 – djskinner 2009-12-11 15:02:40

+0

我使用相同的原則,但在cognos之外執行transfom – djskinner 2009-12-11 15:03:12

1

這intermeidary樣式表是我在迴應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> 
+0

第一次看,這應該工作正常。請檢查所有可能的元數據輸出標籤,以免寫入非法XML字符(在您的示例中,這沒有問題)。我認爲像&,<, >等字符 – Scoregraphic 2009-12-09 16:23:01