1

名前空間がどのように機能するかについて混乱しています。worksheetどこss:Name="Datagrid"からどこdataでノードを取得しようとしていますname="emailname"

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

2 に答える 2

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>.@x:FullRowsこれで、LINQクエリに含めることができます。

VB.NETのこれらのXML機能は、MicrosoftのドキュメントではAxisプロパティと呼ばれています。

XMLをVS2008に貼り付けましたが、問題はAxisプロパティを含むXMLタグで大文字と小文字が区別されることであると判断しました。

''select worksheet where ss:Name="Datagrid""
'Dim dg = From item In root .......................
Dim dg = root.<Worksheet>.FirstOrDefault(Function(w) w.@ss: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) d.@Name = "emailname")
Dim data = dg...<Cell>.FirstOrDefault(Function(d) d.@Name = "emailname")

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

Console.WriteLine(data.<Data>.Value)
于 2012-08-17T13:15:19.120 に答える
0

よりクリーンな構文を取得するには、以下に示す Linq-to-XML XPath 拡張メソッドを試すことをお勧めします。

更新 #1: 以下のコードは、XML ファイルに名前空間が含まれていない場合に機能します。名前空間を考慮するためのソリューションに取り組んでいます。

Dim root = XElement.Load(xmlFile)
Dim data = root.XPathSelectElements("Worksheet[@Name=""Datagrid""]/Table/Row/Cell/Data[@Name=""edata""]")
于 2012-08-16T18:02:54.170 に答える