2011-03-14 83 views
1

我有一個這樣的XML文件模板來自一些IC芯片,我希望能夠將每個Pins Test類型數據存儲爲一個數組,以便稍後我可以在笛卡爾圖上繪製它。可以嵌套XPath迭代嗎?

的數據結構是這樣的: <NUMBER></NUMBER>是IC的特定引腳的名稱 <Curve Count="">被的完成到管腳測試數 <Type></Type>是測試

的類型和存在一些電壓值和電流值那我必須放入一個數組,以便以後使用它。

無論如何!我的問題是如何獲得這些值?我不要求直接回答(但它是appriciated),但一些指導,讓我找到線程真的appriciated。

編輯:如果somone親切地給我一個代碼,從A1有3個電壓和3個電流值,我可以很容易地得到這個想法,並繼續自己。

此XML看起來喜歡這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<Document> 
    <Device>NEC555</Device> 
    <Pins Count="3"> 
    <Pin> 
     <Number>A1</Number> 
     <Curves Count ="3"> 
     <Curve> 
      <Type>PreStress</Type> 
      <VIPairs Count="3"> 
      <VIPair> 
       <Voltage>-2</Voltage> 
       <Current>-0.003</Current> 
      </VIPair> 
      <VIPair> 
       <Voltage>-1</Voltage> 
       <Current>-0.002</Current> 
      </VIPair> 
      <VIPair> 
       <Voltage>-0</Voltage> 
       <Current>-0.001</Current> 
      </VIPair> 
      </VIPairs> 
     </Curve> 
     <Curve> 
      <Type>PreFail</Type> 
      <VIPairs Count="3"> 
      <VIPair> 
       <Voltage>-2</Voltage> 
       <Current>-0.003</Current> 
      </VIPair> 
      <VIPair> 
       <Voltage>-1</Voltage> 
       <Current>-0.002</Current> 
      </VIPair> 
      <VIPair> 
       <Voltage>-0</Voltage> 
       <Current>-0.001</Current> 
      </VIPair> 
      </VIPairs> 
     </Curve> 
     <Curve> 
      <Type>PostFail</Type> 
      <VIPairs Count="0"> 
      </VIPairs> 
     </Curve> 
     </Curves> 
    </Pin> 
    <Pin> 
     <Number>B1</Number> 
     <Curves Count ="3"> 
     <Curve> 
      <Type>PreStress</Type> 
      <VIPairs Count="3"> 
      <VIPair> 
       <Voltage>-3</Voltage> 
       <Current>-0.005</Current> 
      </VIPair> 
      <VIPair> 
       <Voltage>-1</Voltage> 
       <Current>-0.002</Current> 
      </VIPair> 
      <VIPair> 
       <Voltage>-0</Voltage> 
       <Current>-0.001</Current> 
      </VIPair> 
      </VIPairs> 
     </Curve> 
     <Curve> 
      <Type>PreFail</Type> 
      <VIPairs Count="3"> 
      <VIPair> 
       <Voltage>-3</Voltage> 
       <Current>-0.003</Current> 
      </VIPair> 
      <VIPair> 
       <Voltage>-1</Voltage> 
       <Current>-0.002</Current> 
      </VIPair> 
      <VIPair> 
       <Voltage>-0</Voltage> 
       <Current>-0.001</Current> 
      </VIPair> 
      </VIPairs> 
     </Curve> 
     <Curve> 
      <Type>PostFail</Type> 
      <VIPairs Count="0"> 
      </VIPairs> 
     </Curve> 
     </Curves> 
    </Pin> 
    </Pins> 
</Document> 
+0

因爲XPath 1.0節點集是唯一的無序節點集,所以沒有辦法表達一個像你想要分組的分層結構。 – 2011-03-14 16:14:08

回答

0

就像我喜歡使用LINQ和XDocument,這是XPath更簡單的情況。

鑑於你的XML,這個XPath查找所有VIPair元素與給定NumberCurve元素與給定Type下一個Pin元素:

/Document/Device/Pins/Pin[Number='A1']/Curves/Curve[Type='PreStress']/VIPairs/VIPair 

使用的XmlDocument,代碼即可獲得您的三個電壓和電流值應該是這樣的:

string number = "A1"; 
string type = "PreStress" 
string xpath = string.Format(
    "/Document/Device/Pins/Pin[Number='{0}']/Curves/Curve[Type='{1}']/VIPairs/VIPair", 
    number, 
    type); 
foreach (XmlElement viPair in doc.SelectNodes(xpath)) 
{ 
    string current = viPair.SelectSingleNode("Current").Value; 
    string voltage = viPair.SelectSingleNode("Voltage").Value; 
} 

使用一個XDocument,代碼爲:

var values = doc.XPathSelectElements(xpath) 
    .Select(x => new { Voltage = x.Element("Voltage").Value(), 
         Current = x.Element("Current").Value() }); 

除非你的文檔的對抗模式預先驗證,您可能想使最後一個節點測試中的XPath VIPair[Current and Voltage],這樣的代碼不會失敗,如果有一個VIPair元素缺少這些子元素之一。 (或者,您可能實際上想要的代碼在發生異常時拋出異常;這實際上取決於源數據的質量。)

+0

非常感謝,它工作得非常好!我只需要在你的coud中編輯.Value to .InnerText – 2011-03-14 21:27:53

0

看看XDocument

您的特定情況下,它可能會看起來像

XDocument doc = XDocument.Load("yourFilePath"); 

var data = (from pins in doc.Element("Pins").Descendants 
      from pin in pins.Element("Pin") 
      from curve in pin.Element("Curves").Element("Curve") 
      from pair in curve.Element("VIPairs").Descendants.Descendants() 
      select new { 
          Voltage = pair.Element("Voltage").Value(), 
          Current = pair.Element("Current").Value() 
     }); 

該代碼尚未經過測試

+0

謝謝,我試過這段代碼並修正了錯別字,但它返回null。你能再看一下嗎?我無法修復您的代碼以便正常工作。 – 2011-03-14 16:57:20

0

您可以使用一些LINQ到XML,如下所示:

var doc = XDocument.Parse(xml); 
var data = from pin in doc.Descendants("Pin") 
      select new 
      { 
       Number = pin.Element("Number").Value, 
       Curves = 
        from curve in pin.Element("Curves").Descendants("Curve") 
        select new 
        { 
         Type = curve.Element("Type").Value, 
         VIPairs = 
          from pair in curve.Descendants("VIPair") 
          select new 
          { 
           Voltage = pair.Element("Voltage").Value, 
           Current = pair.Element("Current").Value 
          } 
        } 
      };