2011-08-30 99 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等,它會變得不同。 –