2011-08-30 82 views
0

我正在处理xml解析。 我的xml文档是具有两个名称空间的Xml解析

<?xml version="1.0"?> 
<BCPFORMAT 
xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <RECORD> 
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" 
     MAX_LENGTH="12"/> 
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\t" 
     MAX_LENGTH="20" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\r\n" 
     MAX_LENGTH="30" 
     COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    </RECORD> 
    <ROW> 
    <COLUMN SOURCE="1" NAME="age" xsi:type="SQLINT"/> 
    <COLUMN SOURCE="2" NAME="firstname" xsi:type="SQLVARYCHAR"/> 
    <COLUMN SOURCE="3" NAME="lastname" xsi:type="SQLVARYCHAR"/> 
    </ROW> 
</BCPFORMAT> 

请帮我解析这个文档。

+0

只需使用XmlDocument或XDocument。 –

+1

成你想分析的东西?你的输出是什么? –

+0

多数民众赞成在伟大的,你想解析它,但你会怎么做后,你这样做?你可以使用XElement.Parse()把它变成一个XElement? – kmcc049

回答

0

像这样解析一个小型XML文档的标准方法是使用XmlDocument类。为了让您一开始,如果XML文档包含在文件“的test.xml”您可以使用以下方法:

XmlDocument doc = new XmlDocument(); 
doc.Load("test.xml"); 

XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); 
nsmgr.AddNamespace("bulk", "http://schemas.microsoft.com/sqlserver/2004/bulkload/format"); 

XmlElement fieldElement = (XmlElement)doc.SelectSingleNode("bulk:BCPFORMAT/bulk:RECORD/bulk:FIELD[@ID = 1]", nsmgr); 
Console.WriteLine(fieldElement.Attributes["MAX_LENGTH"].Value); 

注意,在上面的例子中,我们需要使用一个XmlNamespaceManager指定元素的命名空间在我们的xpath表达式中。请参阅HOW TO: Specify Namespaces When You Use an XmlDocument to Execute XPath Queries in Visual C# .NET

有关比此更详细的内容,您应该可以使用xpath和XmlDocument类中的许多教程之一。

为了完整起见,下面是使用XDocument类代替的相同示例。为此,您需要使用using System.Xml.XPath;

XDocument doc = XDocument.Load("test.xml"); 

XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable()); 
nsmgr.AddNamespace("bulk", "http://schemas.microsoft.com/sqlserver/2004/bulkload/format"); 

XElement fieldElement = (XElement)doc.XPathSelectElement("bulk:BCPFORMAT/bulk:RECORD/bulk:FIELD[@ID = 1]", nsmgr); 
Console.WriteLine(fieldElement.Attribute(XName.Get("MAX_LENGTH")).Value); 
+0

OP几乎肯定要使用__XDocument__类。 XmlDocument有点过时了,很难使用。 –

+0

@亨克*真* *?充其量,'XDocument'的用法几乎是一样的。如果没有损坏... – Justin

+1

如果您使用桥接XPath方法,则只有相同的用法。如果你使用更原生的.Elements,.Attribute,.Descendents等,它会变得不同。 –

相关问题