C# 具有两个名称空间的Xml解析

C# 具有两个名称空间的Xml解析,c#,xml,serialization,C#,Xml,Serialization,我正在研究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" T

我正在研究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>


请帮助我解析这个文档。

解析像这样的小xml文档的标准方法是使用类。要开始,如果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);
注意,在上面的示例中,我们需要使用指定xpath表达式中元素的名称空间。看

要了解更多详细信息,您应该能够使用xpath和
XmlDocument
类的众多教程之一

为了完整起见,这里是使用类的相同示例。为此,您需要使用
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);

只需使用XmlDocument或XDocument.into,您想将其解析为什么?您的输出是什么?这很好,您希望解析它,但在解析之后您将如何处理它?您可以使用XElement.Parse()将其转换为XElement?目前是什么给您带来了问题?LINQtoXML有很好的名称空间支持,OP几乎肯定想使用XDocument类。XmlDocument有点过时,更难使用。@Henk真的吗?最多情况下,
XDocument
的用法几乎相同。如果它没有损坏…只有在使用桥接XPath方法时,用法才是相同的。如果您使用更多本机的.Elements、.Attribute、.substants等,则会有所不同。