在.Net中读取XML字符串

时间:2013-11-18 12:12:29

标签: .net xml vb.net

有一个sp返回300多行,其中一列的值为FOR XML PATH格式。其他列具有正常值。

<row>
  <DocType>1</DocType>
  <GeneralName>CV</GeneralName>
  <StartDate>1900-12-31</StartDate>
  <EndDate>1900-12-31</EndDate>
  <CertNo></CertNo>
</row>

如何在.Net中读取以下元素的值并将它们分配给变量或对象。

<DocType>
<GeneralName>
<StartDate>
<EndDate>
<CertNo>

ADDED

我尝试过以下代码似乎没问题。

         Dim doc As New XmlDocument()
    doc.LoadXml(xmlString)
    Dim DocType As XmlNode = doc.SelectSingleNode("/row/DocType")
    If Not (DocType Is Nothing) Then
        Dim nr As New XmlNodeReader(DocType)
        While nr.Read()
            MsgBox(nr.ReadInnerXml)
        End While
    End If

还有其他方法可以有效地进行吗?

2 个答案:

答案 0 :(得分:0)

更新 - 我刚刚意识到标签已更改为vb.net但框架类是相同的,所以我希望它仍然有用。

您可以使用XDocument

//assuming that xml contains the string result XML:
    void Main()
    {
        var xml = GoGetSomeXML();//your sp call here, etc.
        var xd = XDocument.Parse(xml);
        foreach (var row in xd.Descendants().Where(x=>x.Name.LocalName=="row"))
        {
           var DocType = GetSubElementValue(row,"DocType");
           var GeneralName = GetSubElementValue(row,"GeneralName");
           var StartDate = GetSubElementValue(row,"StartDate");
           var EndDate = GetSubElementValue(row,"EndDate");
           var CertNo = GetSubElementValue(row,"CertNo");
           Console.WriteLine("{0} {1} {2} {3} {4}",DocType,GeneralName,StartDate,EndDate,CertNo);
        }
    }

    object GetSubElementValue(XElement container, string subElementName)
    {
       var subElement = container.Descendants().FirstOrDefault(d=>d.Name.LocalName==subElementName);
      if (subElement==null) return null;
      return subElement.Value;
    }

产生

1 CV 1900-12-31 1900-12-31 

此外,如果您的结果集可能不会更改并且您可以完全控制数据类型等,您也可以考虑使用XmlSerializer并定义一个表示结果集中各种元素的类:

void Main()
{
    var xd = XDocument.Parse(xml);
    var ser =new XmlSerializer(typeof(row));    
    foreach (var rowElement in xd.Descendants().Where(x=>x.Name.LocalName=="row"))
    {
     using (var reader = rowElement.CreateReader())
     {
       var row1 = ser.Deserialize(reader) as row;
       Console.WriteLine(row1);
      }
    }
}


public class row
{
  public int DocType {get;set;}
  public string GeneralName{get;set;}
  public DateTime StartDate{get;set;}
  public DateTime EndDate{get;set;}
  public string CertNo{get;set;}
}

请注意,您可以使用各种attributes来控制XML如何映射到ClassName和Properties,因此这是一个非常基本的示例 - 当您使用时,类名称不必是“row” XmlRootAttribute等等......

对于大量数据,Serialiser路由可能效率最高,但对于300行,我不确定您会看到多少差异。

答案 1 :(得分:0)

您可以快速将XML数据转换为数据集:

Imports System.Xml
...
Public Function GetXMLDataset(XMLText As String) As DataSet
    Try
        Dim ds As New DataSet
        Dim xd As New XmlDocument
        xd.LoadXml(XMLText)
        ds.ReadXml(New XmlNodeReader(xd), XmlReadMode.InferSchema)
        Return ds
    Catch ex As Exception
        MsgBox(ex.Message)
        Return Nothing
    End Try
End Function