2012-08-16 2 views
1

네임 스페이스가 어떻게 작동하는지 혼란 스럽습니다. 나는 Linq에 - 투 - XML의 XPath 확장을 시도하는 것이 좋습니다의 worksheetss:Name="Datagrid"을 얻으려고 노력했고, 그로부터 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

는 청소기 구문을 얻을 수있는 data 노드를 얻을 수있어 방법.

업데이트 # 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에 의해 정의 된 네임 스페이스를 제공 할 것입니다.

이제 LINQ 쿼리를 포함하여 <Workbook>...<Table>[email protected]:FullRows에 액세스 할 수 있습니다.

Microsoft 문서에서 VB.NET의 이러한 XML 기능을 Axis Properties이라고합니다.

내가 VS2008로 XML을 붙여 당신의 문제는 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

이 봐, 당신은 이미 구문을 "'사용하고 item. @ ss : Name' "! 그래서 나는 당신의 질문을 오해 했습니까? –

+0

나는 그렇게 생각한다. ss : Name = "Datagrid"라는 이름의 DataGrid를 얻으려고하고 있는데, 그 이름은 "data"(ss : name = "data"가 아닌) 인 노드가된다. – WhiskerBiscuit

+0

기본 네임 스페이스 'xmlns')는'xmlns : ss'와 같기 때문에'name'과'ss : name'은 같습니다. –

관련 문제