需要分析从数据库存储过程返回的 XML 字符串



我有一个在字段中返回一些XML的存储过程调用。还有其他字段返回 XML,但只返回其中的一个元素。这个新字段将包含多个元素,需要循环访问这些元素才能为最终用户显示字符串。

下面是将返回的 XML 示例:

<Superbills>
    <Superbill>
        <SuperBillID>1</SuperBillID>
        <EventDate>2004-03-23T13:24:16</EventDate>
        <ProcCodes>
            <ProcCode>27096</ProcCode>
            <ProcCode>76005</ProcCode>
            <ProcCode>A4550</ProcCode>
            <ProcCode>A4641</ProcCode>
            <ProcCode>J3301</ProcCode>
        </ProcCodes>
    </Superbill>
    <Superbill>
        <SuperBillID>2</SuperBillID>
        <EventDate>2004-03-23T13:24:16</EventDate>
        <ProcCodes>
            <ProcCode>27096</ProcCode>
            <ProcCode>76005</ProcCode>
            <ProcCode>A4550</ProcCode>
            <ProcCode>A4641</ProcCode>
            <ProcCode>J3301</ProcCode>
        </ProcCodes>
    </Superbill>
    <Superbill>
        <SuperBillID>3</SuperBillID>
        <EventDate>2004-03-24T13:24:16</EventDate>
        <ProcCodes>
            <ProcCode>27096</ProcCode>
            <ProcCode>76005</ProcCode>
            <ProcCode>A4550</ProcCode>
            <ProcCode>A4641</ProcCode>
            <ProcCode>J3301</ProcCode>
        </ProcCodes>
    </Superbill>
</Superbills>

我需要能够遍历所有超级账单集以输出类似于以下内容的内容:

[EventDate] ([ProcCode], [ProcCode], [ProcCode], [ProcCode], [ProcCode])
[EventDate] ([ProcCode], [ProcCode], [ProcCode], [ProcCode], [ProcCode])

基本上,我需要为 Superbill 集中的每个ProcCode构建一个逗号分隔字符串,并解析出事件日期以为每个字符串构建一个字符串。

我试过遍历using XmlReader,但这并没有给我每个"超级账单"元素的单独行。它最终只给了我一起的活动日期,然后ProcCode在一起。

感谢您的任何输入。

我采用了序列化程序方法...

Imports System.IO
Imports System.Text
Imports System.Xml.Serialization
Module Module1
    Sub Main()
        Dim XMLString As String = File.ReadAllText("SuperBills.xml")
        With New XmlSerializer(GetType(Superbills)).Deserialize(New IO.MemoryStream(Encoding.UTF8.GetBytes(XMLString)))
            For Each SuperBill As Superbill In .Superbills
                Debug.Print("{0} ({1})", SuperBill.EventDate.ToShortDateString, Join(SuperBill.ProcCodes, ", "))
            Next
        End With
    End Sub
End Module
<XmlRoot()>
Partial Public Class Superbills
    <XmlElement("Superbill")>
    Public Property Superbills As Superbill()
End Class
Partial Public Class Superbill
    Public Property SuperBillID As Byte
    Public Property EventDate As Date
    <XmlArrayItem("ProcCode")>
    Public Property ProcCodes As String()
End Class

这是你要找的吗?

3/23/2004 (27096, 76005, A4550, A4641, J3301)
3/23/2004 (27096, 76005, A4550, A4641, J3301)
3/24/2004 (27096, 76005, A4550, A4641, J3301)

如果您只需要EventDataProcCode值,则可以使用 Linq To Xml

Dim doc As XDocument = XDocument.Parse(yourString)
var eventsAndCodes = 
    doc.Descendants("Superbill").
        Select(Function(bill) 
                   Return New With
                   {
                       .EventData = bill.Element("EventDate").Value,
                       .ProcCodes = bill.Descendants("ProcCode").Select(Function(code) code.Value).ToList()
                   }
               End Function)
For Each data in eventsAndCodes
    ' Use values
    data.EventData
    data.ProcCodes
Next

您可以创建自己的类型而不是匿名类型以获得更好的可读性

Public Class EventInfo
    Public Property EventDate As Date
    Public Property ProcCodes As List(Of String)
End Class

以及从XElement中检索数据的方法

Public Function CreateEventInfoFromXElement(element As XElement) As EventInfo
    Return New EventInfo With
    {
        .EventData = bill.Element("EventDate").Value,
        .ProcCodes = bill.Descendants("ProcCode").
                          Select(Function(code) code.Value).
                          ToList()
    }
End Function

然后使用它们

Dim doc As XDocument = XDocument.Parse(yourString)
Dim eventsData As IEnumerable(Of EventInfo) = 
    doc.Descendants("Superbill").Select(AddressOf CreateEventInfoFromXElement)

我能够使用 LinqToXml 做到这一点:

var doc = XElement.Parse("...xml...");
var list = doc.XPathSelectElements("//EventDate")
    .Select(e => DateTime.Parse(e.Value).ToShortDateString() + ", (" +
    string.Join(", ", e.ElementsAfterSelf().First().Elements().Select(e2 => e2.Value)) +
    ")").ToList();

转换为 VB:

Dim doc as XElement = XElement.Parse("...xml...")
Dim list as List(of String) = doc.XPathSelectElements("//EventDate").
    Select(Function(e) DateTime.Parse(e.Value).ToShortDateString & 
    ", (" & String.Join(", ", e.ElementsAfterSelf.First.Elements.
    Select(Function(e2) e2.Value)) & ")").ToList

它不是超级漂亮,但它有效。 它在文档中搜索所有EventDate元素,将它们解析为日期,并输出 ShortDate 格式,然后获取下一个同级元素中的所有元素,并用逗号连接它们的值。 它确实假设ProcCode元素将始终紧跟在EventDate之后,如果不是,它将失败。 如果这不符合您的要求,我可以更新它以使其更具弹性。

它生成一个字符串列表,每个字符串对应一个EventDate,格式如下:

2004/3/23, (27096, 76005, A4550, A4641, J3301)
2004/3/23, (27096, 76005, A4550, A4641, J3301)
2004/3/24, (27096, 76005, A4550, A4641, J3301)

最新更新