Scenario
现有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">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Author>微软中国</Author>
<LastAuthor>微软中国</LastAuthor>
<Created>2007-12-18T14:27:37Z</Created>
<Company>微软中国</Company>
<Version>11.6360</Version>
</DocumentProperties>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>8550</WindowHeight>
<WindowWidth>11700</WindowWidth>
<WindowTopX>240</WindowTopX>
<WindowTopY>75</WindowTopY>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Center"/>
<Borders/>
<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
</Styles>
<Worksheet ss:Name="Sheet1">
<Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<Selected/>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
<Worksheet ss:Name="Sheet2">
<Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
<Worksheet ss:Name="Sheet3">
<Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>
1、要读取Worksheet节点个数
XmlDocument doc = new XmlDocument();
doc.Load(@"D:\appTemp\Try\ClassLibrary1\Book1.xml");
XmlNode rootNode = doc.DocumentElement;//根节点
XmlNamespaceManager namespaceManager = new XmlNamespaceManager(doc.NameTable);
//添加命名空间声明
namespaceManager.AddNamespace("d", "urn:schemas-microsoft-com:office:spreadsheet"); //默认命名空间也要添加名称
namespaceManager.AddNamespace("o", "urn:schemas-microsoft-com:office:office");
namespaceManager.AddNamespace("x", "urn:schemas-microsoft-com:office:excel");
namespaceManager.AddNamespace("ss", "urn:schemas-microsoft-com:office:spreadsheet");
namespaceManager.AddNamespace("html", "http://www.w3.org/TR/REC-html40");
Console.WriteLine(rootNode.SelectNodes("/d:Workbook/d:Worksheet", //调用默认的命名空间Prefix
namespaceManager).Count);
或者不使用XmlNamespaceManager,在XPath使用函数local-name()。
Console.WriteLine(rootNode.SelectNodes("//*[local-name()='Worksheet']").Count);
其中XPath意思:在整个XML所有元素中寻找
处于第一位的节点的扩展名称本地部分为“Worksheet”的节点元素。
MSND(vs2005):
扩展名称通常包括命名空间 URI(或关联的前缀)、冒号 (:) 和本地部分。例如,b:author
是扩展名称,其中 b
是命名空间 URI 前缀,author
是本地部分。所以,对此节点应用 local-name()
函数将返回 author
。如果节点没有扩展名称,例如 author
,对此节点应用 local-name()
函数将返回原始节点名称,即 author
。
2、查找Workbook\DocumentProperties节点
//DocumentProperties使用另外的默认命名空间“urn:schemas-microsoft-com:office:office”
Console.WriteLine(rootNode.SelectSingleNode("/d:Workbook/o:DocumentProperties",
namespaceManager).InnerText);
注意,要用1的namespaceManager对象。
3、获取Workbook中Name等于"Sheet1"的Worksheet节点中,Table的DefaultColumnWidth属性值。
Console.WriteLine(rootNode.SelectSingleNode("/d:Workbook/d:Worksheet[@ss:Name='Sheet1']/d:Table/@ss:DefaultColumnWidth",
namespaceManager).Value);
注意,要用1的namespaceManager对象。