首页 > 解决方案 > 无法使用 c# 和 XDocument 找出 XML 结构

问题描述

我已经尝试了几个小时。

我需要访问顶部的数据以获取 SenderCode

然后我需要遍历所有 RecipientDeliveries 部分并获取 RecipientCode,然后是该部分的名称/地址信息。

为了尝试交付我已经尝试过这个(以及大约 100 种变体)。没有错误,但没有返回数据(“枚举没有结果”)

在下面,如果有代码通过每个收件人部分,我需要做什么,获取该部分的“收件人代码”,然后获取各种名称和地址。

我可以通过这样做获得特定的 SenderCode:

string xmlText;
            using (var memoryStream = new MemoryStream())
            {
                ASN_Blob.DownloadToStream(memoryStream);
                xmlText = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray());
            }

            var document = XDocument.Parse(xmlText);
            var aw2 = "http://www.omnicare.com/schema/AdvancedShippingNotices.xsd";
            var SenderCode = document.Descendants(XName.Get("SenderCode",aw2)).First().Value;

但是继续撞墙过去。

这是我需要解码的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:AdvancedShippingNotices xmlns:ns0="http://www.omnicare.com/schema/AdvancedShippingNotices.xsd">
    <ns0:ASNID>4129114</ns0:ASNID>
    <ns0:CourierID>4SAMEDAY</ns0:CourierID>
    <ns0:SenderCode>598</ns0:SenderCode>
    <ns0:SenderNameAndAddress>
        <ns0:Name>Customer of San Diego</ns0:Name>
        <ns0:Address>
            <ns0:Line1>5601 Oberlin Drive, Suite 124</ns0:Line1>
            <ns0:CityTownOrLocality>San Diego</ns0:CityTownOrLocality>
            <ns0:StateOrProvince>CA</ns0:StateOrProvince>
            <ns0:PostalCode>92121-3709</ns0:PostalCode>
        </ns0:Address>
    </ns0:SenderNameAndAddress>
    <ns0:RecipientDeliveries>
        <ns0:Recipient>
            <ns0:RecipientCode>1019</ns0:RecipientCode>
            <ns0:RecipientNameAndAddress>
                <ns0:Name>VILLAGE SQUARE HEALTHCARE CTR</ns0:Name>
                <ns0:Address>
                    <ns0:Line1>1586 W SAN MARCOS BLVD</ns0:Line1>
                    <ns0:CityTownOrLocality>SAN MARCOS</ns0:CityTownOrLocality>
                    <ns0:StateOrProvince>CA</ns0:StateOrProvince>
                    <ns0:PostalCode>92069</ns0:PostalCode>
                </ns0:Address>
            </ns0:RecipientNameAndAddress>
            <ns0:Deliveries>
                <ns0:Delivery>
                    <ns0:DeliveryID>8930798-5</ns0:DeliveryID>
                    <ns0:DeliveryType>ROUTE</ns0:DeliveryType>
                    <ns0:DeliveryRoute>R0130</ns0:DeliveryRoute>
                    <ns0:ToteID>S5-278</ns0:ToteID>
                    <ns0:NursingStation>2</ns0:NursingStation>
                </ns0:Delivery>
            </ns0:Deliveries>
        </ns0:Recipient>
        <ns0:Recipient>
            <ns0:RecipientCode>20366</ns0:RecipientCode>
            <ns0:RecipientNameAndAddress>
                <ns0:Name>OAKMONT OF ESCONDIDO HILLS</ns0:Name>
                <ns0:Address>
                    <ns0:Line1>3012 BEAR VALLEY PKWY</ns0:Line1>
                    <ns0:CityTownOrLocality>ESCONDIDO</ns0:CityTownOrLocality>
                    <ns0:StateOrProvince>CA</ns0:StateOrProvince>
                    <ns0:PostalCode>92025</ns0:PostalCode>
                </ns0:Address>
            </ns0:RecipientNameAndAddress>
            <ns0:Deliveries>
                <ns0:Delivery>
                    <ns0:DeliveryID>8930798-4</ns0:DeliveryID>
                    <ns0:DeliveryType>ROUTE</ns0:DeliveryType>
                    <ns0:DeliveryRoute>R0130</ns0:DeliveryRoute>
                    <ns0:ToteID>F1-101</ns0:ToteID>
                    <ns0:NursingStation>AL</ns0:NursingStation>
                </ns0:Delivery>
            </ns0:Deliveries>
        </ns0:Recipient>
    </ns0:RecipientDeliveries>
</ns0:AdvancedShippingNotices>

更新:我接受了一个很好的工作解决方案。但我也想出了这个也有效的方法。我在这里发布它以防万一它对其他人有帮助。

//go get the file pointed to by the message in the Blob Storage
            CloudBlockBlob ASN_Blob = getBlockBlobByName(fileName, storageAccount, blobContainerName);

            string xmlText;
            using (var memoryStream = new MemoryStream())
            {
                ASN_Blob.DownloadToStream(memoryStream);
                xmlText = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray());
            }

 //use a dataset
            DataSet Ds = new DataSet();
            System.IO.StringReader xmlSR1 = new System.IO.StringReader(xmlText);
            Ds.ReadXml(xmlSR1);

 //get all of the individual totes or items
            var Deliveries = (from rec in Ds.Tables["Delivery"].AsEnumerable()

                             select new
                             {
                                 fir = rec[0],
                                 sec = rec[1],
                                 thi = rec[2],
                                 forth = rec[3],
                                 nursingStation = rec[4],
                                 delId = Convert.ToInt16( rec[5])

                             }).ToArray();

//combine them -- needs to be expanded still
var comb3 = (from recipient in Ds.Tables["Recipient"].AsEnumerable()
                         join recName in Ds.Tables["RecipientNameAndAddress"].AsEnumerable() on recipient[1] equals recName[1]
                         join address in Ds.Tables["Address"].AsEnumerable() on recipient[1] equals address[6]
                         select new
                         {
                             recipientName = recName[0],
                             receipientCode = recipient[0],
                             add1 = address[0],
                             Id = recName[1]

                         }
                         ).ToArray();
//prove out that everythying is there
 foreach (var stop in comb3)
            {
                Console.WriteLine($"name: {stop.recipientName} address: {stop.add1}");

                //get all the items for this stop
                var items = (from i in Deliveries where i.delId == Convert.ToInt16(stop.Id) select i).ToArray();
                foreach (var tote in items)
                {
                    Console.WriteLine($"DeliveryId: {tote.fir}  Type:{tote.sec} Nursing Station: -{tote.nursingStation}-");
                }

            }

标签: c#xml

解决方案


尝试这样的事情......从您的代码段创建一个 xml 文件后,在我的机器上工作。

XElement dataFromXML = XElement.Parse(xmlText);   
XNamespace aw = "http://www.xxxxxx.com/schema/AdvancedShippingNotices.xsd";
var textSegs = dataFromXML.Descendants(aw + "RecipientDeliveries");
IEnumerable<XElement> textSegs = dataFromXML.Descendants(aw + "RecipientDeliveries");
var recipients = textSegs.Descendants(aw + "RecipientCode");
var address = recipients.Select(x => x.NextNode).FirstOrDefault();

我还建议将来发布一个小而有效的 xml 片段,让那些帮助你的人不必这样做。


推荐阅读