C# 无法使用c和XDocument确定XML结构

C# 无法使用c和XDocument确定XML结构,c#,xml,C#,Xml,我已经试了好几个小时了 我需要访问顶部部分中的数据才能获得SenderCode 然后我需要遍历所有RecipientDeliveries部分,获得RecipientCode,然后是该部分的名称/地址信息 为了尝试和获得交付,我已经尝试了这个和大约100个变化。 无错误,但未返回任何数据枚举未产生任何结果 在下面我需要做的是,如果有代码通过每个收件人部分,抓取该部分的“RecipientCode”,然后获得各种名称和地址 我可以通过以下操作获取特定的SenderCode: string xmlTe

我已经试了好几个小时了

我需要访问顶部部分中的数据才能获得SenderCode

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

为了尝试和获得交付,我已经尝试了这个和大约100个变化。 无错误,但未返回任何数据枚举未产生任何结果

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

我可以通过以下操作获取特定的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>

尝试这样的方法…在从代码片段创建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片段,这样可以帮助您避免这样做

试试这样的方法……在从代码片段创建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片段,这样可以帮助您避免这样做

使用xml linq XDocument:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XNamespace ns0 = doc.Root.GetNamespaceOfPrefix("ns0");

            XElement sender = doc.Descendants(ns0 + "SenderNameAndAddress").FirstOrDefault();
            string[] senderAddress = sender.Descendants(ns0 + "Address").Elements().Select(x => (string)x).ToArray();

            XElement recipientDeliveries = doc.Descendants(ns0 + "RecipientDeliveries").FirstOrDefault();

            var results = recipientDeliveries.Elements(ns0 + "Recipient").Select(x => new
            {
                name = (string)x.Descendants(ns0 + "Name").FirstOrDefault(),
                address = x.Descendants(ns0 + "Address").Elements().Select(y => (string)y).ToArray(),
                deliveryID = (string)x.Descendants(ns0 + "DeliveryID").FirstOrDefault(),
                deliveryType = (string)x.Descendants(ns0 + "DeliveryType").FirstOrDefault(),
                deliveryRoute = (string)x.Descendants(ns0 + "DeliveryRoute").FirstOrDefault(),
                toteID = (string)x.Descendants(ns0 + "ToteID").FirstOrDefault(),
                nursingStation = (string)x.Descendants(ns0 + "NursingStation").FirstOrDefault()
            }).ToList();
        }
    }
}

使用xml linq XDocument:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XNamespace ns0 = doc.Root.GetNamespaceOfPrefix("ns0");

            XElement sender = doc.Descendants(ns0 + "SenderNameAndAddress").FirstOrDefault();
            string[] senderAddress = sender.Descendants(ns0 + "Address").Elements().Select(x => (string)x).ToArray();

            XElement recipientDeliveries = doc.Descendants(ns0 + "RecipientDeliveries").FirstOrDefault();

            var results = recipientDeliveries.Elements(ns0 + "Recipient").Select(x => new
            {
                name = (string)x.Descendants(ns0 + "Name").FirstOrDefault(),
                address = x.Descendants(ns0 + "Address").Elements().Select(y => (string)y).ToArray(),
                deliveryID = (string)x.Descendants(ns0 + "DeliveryID").FirstOrDefault(),
                deliveryType = (string)x.Descendants(ns0 + "DeliveryType").FirstOrDefault(),
                deliveryRoute = (string)x.Descendants(ns0 + "DeliveryRoute").FirstOrDefault(),
                toteID = (string)x.Descendants(ns0 + "ToteID").FirstOrDefault(),
                nursingStation = (string)x.Descendants(ns0 + "NursingStation").FirstOrDefault()
            }).ToList();
        }
    }
}


这些都是您的xml吗?结束标记在哪里?不…它会一直持续下去…但是有多个收件人部分。您尝试过xpath吗?这些都是您的xml吗?结束标记在哪里?不…它会一直持续下去…但是有多个收件人部分。您尝试过xpath吗?这确实给了我一个值,但是我如何访问其中的各种元素呢?编辑后的答案是你想要的吗?我想你得到了jist,你需要一个名称空间。名称空间肯定是朝着正确方向迈出的一步…我没有看到你的编辑…正在检查。。。不,我得继续敲。我在address中看到返回的值是WOODLAND CARE CENTER*EMAR*1,但我无法访问该值,它仍然仅适用于1个值,而不能单步查看它们的列表。我还在努力。这确实给了我一个值,但我如何访问其中的各种元素?编辑后的答案是你想要的吗?我想你得到了jist,你需要一个名称空间。名称空间肯定是朝着正确方向迈出的一步…我没有看到你的编辑…正在检查。。。不,我得继续敲。我在address中看到返回的值是WOODLAND CARE CENTER*EMAR*1,但我无法访问该值,它仍然仅适用于1个值,而不能单步查看它们的列表。我还在努力。我正在努力让它为我工作。我需要一种方法将这两个数组绑定在一起,这意味着传递的信息与地址一致,但这是非常有帮助的。我必须离开一会儿,但一回来就会更新一切。谢谢你的帮助!我是在使用数据表和加入他们解决问题的工作,但不是很干净。这样好多了。我也用我的解决方案更新了我的问题,但我用的是你的。谢谢。我遇到了一个新的障碍,但如果你想尝试一下的话,我提出了一个不同的问题@jdweng:我正在努力让它为我工作。我需要一种方法将这两个数组绑定在一起,这意味着传递的信息与地址一致,但这是非常有帮助的。我必须离开一会儿,但一回来就会更新一切。谢谢你的帮助!我是在使用数据表和加入他们解决问题的工作,但不是很干净。这样好多了。我也用我的解决方案更新了我的问题,但我用的是你的。谢谢。我遇到了一个新的障碍,但如果你想尝试一下@jdweng,我提出了一个不同的问题: