System.Xml.Linq.XContainer.Element(...) 返回 null

System.Xml.Linq.XContainer.Element(...) returned null

提问人:John Paul Johns 提问时间:2/19/2023 最后编辑:John Paul Johns 更新时间:2/21/2023 访问量:76

问:

我有postXmlData方法在Xml中发布请求和获取响应。收到响应后,我试图显示属性名称 startswith (“f”),但收到错误 System.Xml.Linq.XContainer.Element(...) 返回 null。我做错了什么?

postXml数据

public static XmlDocument postXMLData(string xml)
        {
            var request = (HttpWebRequest)WebRequest.Create(Requests.url);
            byte[] bytes;
            bytes = System.Text.Encoding.ASCII.GetBytes(xml);
            request.ContentType = "text/xml; encoding='utf-8'";
            request.ContentLength = bytes.Length;
            request.Method = "POST";
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(bytes, 0, bytes.Length);
            requestStream.Close();
            HttpWebResponse response;
            response = (HttpWebResponse)request.GetResponse();

            if (response.StatusCode == HttpStatusCode.OK)
            {
                using (var streamReader = new StreamReader(response.GetResponseStream()))
                {
                    var responseText = streamReader.ReadToEnd();
                    var result = new XmlDocument();
                    result.LoadXml(responseText);
                    return result;
                }
            }

            throw new Exception();
        }

请求响应:

<response result="0">
    <prov>
        <getStatus result="0">
            <pay date="2023-02-08T19:44:33+03:00" fatal="false" id="8022140013003" result="0" status="2" uid="26775263057008" value-date="2023-02-08T19:44:40+03:00">
            </pay>
        </getStatus>
    </prov>
</response>

为了显示属性,我正在使用 XElement:

XmlDocument doc = postXMLData(Requests.getStatus("08022140013003"));
            XElement e = XElement.Load(new XmlNodeReader(doc));
            Console.WriteLine(e); //here ok
           
            IEnumerable<XAttribute> attrs1 = e.Element("response").Element("prov").Element("getStatus").Element("pay")?.Attributes().Where(a => a.Name.LocalName.StartsWith("f"));
            Console.WriteLine(attrs1);
            Console.ReadKey();
C# LINQ-to-XML XML文档

评论

0赞 Klaus Gütter 2/19/2023
你的意思是没有“s”的 Element(“pay”) 吗?
0赞 John Paul Johns 2/19/2023
@KlausGütter我的意思是显示元素(“pay”)中的属性,其中属性名称以字母(“f”)开头
0赞 Klaus Gütter 2/19/2023
但是你写的是 Elements(“pay”) 而不是 Element(“pay”)
0赞 John Paul Johns 2/19/2023
@KlausGütter哦,是的,我没有看到。但即使我更改了它,也犯了同样的错误

答:

0赞 Jazz. 2/19/2023 #1

尝试:

var attrs1 = e.Element("prov").Element("getStatus").Element("pay").Attributes().Where(a => a.Name.LocalName.StartsWith("f"));

您可以通过执行以下操作来验证这一点:

var elements = e.Elements()

只有 1 个元素,它不是 但是.responseprov

编辑:

XmlDocument doc = postXMLData(Requests.getStatus("08022140013003"));
XElement e = XElement.Load(new XmlNodeReader(doc));
//This line:
var elementsArray = e.Elements().ToArray();
Console.WriteLine(e); //here ok
           
IEnumerable<XAttribute> attrs1 = e.Element("response").Element("prov").Element("getStatus").Element("pay")?.Attributes().Where(a => a.Name.LocalName.StartsWith("f"));
Console.WriteLine(attrs1);
Console.ReadKey();

评论

0赞 John Paul Johns 2/19/2023
对于第一个变体,我得到了空的控制台,没有显示任何东西。然后我使用 e.Elements() 控制台进行验证,显示“System.Linq.Enumerable+WhereEnumarableIterator'1[System.Xml.Linq.XAttributs]”。System.Linq 和 System.Xml.Linq 已连接
0赞 Jazz. 2/19/2023
我会重新评论而不是通过控制台进行调试,以使用 IDE 并通过在线设置断点。此外,要查看 的内容,您可以暂时将其转换为 或 通过 或F9//here okWhereArrayListe.Elements().ToArray().ToList()
0赞 John Paul Johns 2/19/2023
请您展示一下该怎么做?我不知道
0赞 Jazz. 2/19/2023
您使用的是 IDE 吗?Visual Studio?Visual Studio Code?骑手?
0赞 John Paul Johns 2/19/2023
我正在使用 Visual Studio,我的意思是你能写 please 代码从 a 到 z 请转换为数组吗&
0赞 Martin Honnen 2/21/2023 #2

鉴于你这样做,例如

        XElement e = XElement.Load(new XmlNodeReader(doc));

选择应相对于响应元素,即而不是

        IEnumerable<XAttribute> attrs1 = e.Element("response").Element("prov").Element("getStatus").Element("pay")?.Attributes().Where(a => a.Name.LocalName.StartsWith("f"));

你需要

        IEnumerable<XAttribute> attrs1 = e.Element("prov").Element("getStatus").Element("pay")?.Attributes().Where(a => a.Name.LocalName.StartsWith("f"));