2012-08-16 20 views
1

我對名稱空間是如何工作感到困惑。我試圖讓worksheet其中ss:Name="Datagrid",並從獲得data節點,在name="emailname"如何使用名稱空間使用...語法創建linq查詢

Imports <xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"> 
Module Module1 
    Sub Main() 
     Dim xmlFile As String = System.AppDomain.CurrentDomain.BaseDirectory & "Datagrid.xml" 
     Dim root As XElement = XElement.Load(xmlFile) 

    ''select worksheet where ss:Name="Datagrid"" 
    'Dim dg = From item In root ....................... 

    ''get data from wokrsheet...table..row...data where = name="emailname" (not ss:name="emailname") 

    'Dim data = From item In dg ....................... 
    End Sub 
End Module 

XML

<?xml version="1.0"?> 
<?mso-application progid="Excel.Sheet"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:o="urn:schemas-microsoft-com:office:office" 
xmlns:x="urn:schemas-microsoft-com:office:excel" 
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:html="http://www.w3.org/TR/REC-html40"> 
    <Worksheet ss:Name="Datagrid"> 
    <Table ss:ExpandedColumnCount="13" ss:ExpandedRowCount="11" x:FullColumns="1" 
    x:FullRows="1" ss:DefaultRowHeight="15"> 
     <Row ss:Index="3" ss:AutoFitHeight="0"> 
     <Cell Name="emailname"> 
      <Data ss:Type="String">email address</Data> 
     </Cell> 
     </Row> 
     <Row ss:Index="4" ss:AutoFitHeight="0"> 
     <Cell Name="username"> 
      <Data ss:Type="String">user name</Data> 
     </Cell> 
     </Row> 
    </Table> 
    </Worksheet> 
    <Worksheet ss:Name="Properties"> 
    <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="3" x:FullColumns="1" 
    x:FullRows="1" ss:DefaultRowHeight="15"> 
     <Row> 
     <Cell> 
      <Data ss:Type="Number">1</Data> 
     </Cell> 
     </Row> 
     <Row> 
     <Cell> 
      <Data ss:Type="Number">2</Data> 
     </Cell> 
     </Row> 
     <Row> 
     <Cell> 
      <Data ss:Type="Number">3</Data> 
     </Cell> 
     </Row> 
    </Table> 
    </Worksheet> 
</Workbook> 

回答

0

要獲得更清晰的語法,建議您嘗試Linq到XML XPath擴展方法如下所示。

更新#1:如果XML文件不包含任何名稱空間,則下面的代碼有效。研究解決方案以考慮名稱空間。

Dim root = XElement.Load(xmlFile) 
Dim data = root.XPathSelectElements("Worksheet[@Name=""Datagrid""]/Table/Row/Cell/Data[@Name=""edata""]") 
1

用文件頂部的Imports聲明聲明命名空間。然後你可以用<ns:name>語法來引用它們。

所以

Imports <xmlns="urn:schemas-microsoft-com:office:spreadsheet"> 
Imports <xmlns:o="urn:schemas-microsoft-com:office:office"> 
Imports <xmlns:x="urn:schemas-microsoft-com:office:excel"> 
Imports <xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"> 
Imports <xmlns:html="http://www.w3.org/TR/REC-html40"> 

會給你通過您所提供的XML定義的命名空間。

現在您可以訪問<Workbook>...<Table>[email protected]:FullRows,包括LINQ查詢。

VB.NET的這些XML特性在Microsoft文檔中被稱爲Axis Properties

我粘貼您的XML到VS2008和確定您的問題是,XML標記,包括軸屬性,是大小寫敏感的

''select worksheet where ss:Name="Datagrid"" 
'Dim dg = From item In root ....................... 
Dim dg = root.<Worksheet>.FirstOrDefault(Function(w) [email protected]:Name = "Datagrid") 

If dg Is Nothing Then _ 
    Throw New Exception("DataGrid not found") 

''get data from wokrsheet...table..row...data where = name="emailname" (not ss:name="emailname") 

'Dim data = From item In dg ....................... 
' Both of the following lines work, but the second answers the question in the title: 
'Dim data = dg.<Table>.<Row>.<Cell>.FirstOrDefault(Function(d) [email protected] = "emailname") 
Dim data = dg...<Cell>.FirstOrDefault(Function(d) [email protected] = "emailname") 

If data Is Nothing Then _ 
    Throw New Exception("emailname not found") 

Console.WriteLine(data.<Data>.Value) 
+0

嘿,你已經在使用這個語法「'按照項@ SS:Name'「!那麼我是否誤解了你的問題? – 2012-08-17 13:29:32

+0

我這樣想,我試圖得到datagrid其ss:Name =「Datagrid」,並從那得到節點的名稱=「data」(不是ss:name =「data」) – WhiskerBiscuit 2012-08-17 15:11:49

+0

注意默認命名空間'xmlns')與'xmlns:ss'相同,所以'name'和'ss:name'是相同的。 – 2012-08-17 18:14:42