Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 停留在基本的Linq到XML查询上_C#_Linq_Linq To Xml - Fatal编程技术网

C# 停留在基本的Linq到XML查询上

C# 停留在基本的Linq到XML查询上,c#,linq,linq-to-xml,C#,Linq,Linq To Xml,我正试图从namecheap沙盒api中提取信息,但不明白为什么我的linq查询不起作用 下面是一个示例响应 XML <ApiResponse Status="OK" xmlns="http://api.namecheap.com/xml.response"> <Errors /> <Warnings /> <RequestedCommand>namecheap.domains.check</RequestedCommand>

我正试图从namecheap沙盒api中提取信息,但不明白为什么我的linq查询不起作用

下面是一个示例响应

XML

<ApiResponse Status="OK" xmlns="http://api.namecheap.com/xml.response">
  <Errors />
  <Warnings />
  <RequestedCommand>namecheap.domains.check</RequestedCommand>
  <CommandResponse>
    <DomainCheckResult Domain="google.com" Available="false" />
  </CommandResponse>
  <Server>WEB1-SANDBOX1</Server>
  <GMTTimeDifference>--4:00</GMTTimeDifference>
  <ExecutionTime>0.875</ExecutionTime>
</ApiResponse>
我也用同一个文档尝试了这个查询,只是想看看一个简单的例子是否有效

var test = doc.Descendants("RequestedCommand").First().Value;
但两者都返回null。那么我错在哪里呢?我最终需要了解CommandResponse中的顶层元素和深层元素。如果有任何帮助,我们也将不胜感激

更新

正如Jon的回答所提到的,这主要是在引用各种元素时不使用名称空间的问题。还使用了doc.Elements()而不是doc.Root。后代()

这是一个更新的工作版本

XNamespace ns = "http://api.namecheap.com/xml.response";
var response = (
    from r in doc.Elements()
    select new
    {
        Errors = r.Element(ns + "Errors").Value,
        Warnings = r.Element(ns + "Warnings").Value,
        RequestedCommand = r.Element(ns + "RequestedCommand").Value,
        CommandResponse = r.Element(ns + "CommandResponse").Value,
        Server = r.Element(ns + "Server").Value
    }
);

问题是在查找元素、子体等时没有使用名称空间:

XNamespace ns = "http://api.namecheap.com/xml.response";
var doc = XDocument.Load(url);
var response = doc.Root
                  .Descendants(ns + "ApiResponse")
                  .Select(r => new {
                              Errors = r.Element(ns + "Errors").Value,
                              ...
                          });
(请注意,在LINQ中,您永远不需要
,其中1==1
,我已经从查询表达式语法中更改了它,因为它没有给您任何东西。)

名称空间继承自
元素,作为所有其他元素的默认名称空间,因为它只是
xmlns=…
,而不是指定别名

还要注意的是,如果您已经向我们展示了整个XML文档,那么上面的内容将找不到任何元素,因为您要求根元素下面的
ApiReponse
元素,而它是根元素。

我刚刚被Skeeted;)

我在linqpad中做了一些事情,以获得XML中的一个元素

var myxml = @"<ApiResponse Status=""OK"" xmlns=""http://api.namecheap.com/xml.response"">
<Server>WEB1-SANDBOX1</Server>
<Errors />
<Warnings />
<RequestedCommand>namecheap.domains.check</RequestedCommand>
<CommandResponse>
    <DomainCheckResult Domain=""google.com"" Available=""false"" />
</CommandResponse>

<GMTTimeDifference>--4:00</GMTTimeDifference>
<ExecutionTime>0.875</ExecutionTime>
</ApiResponse>";

//myxml.Dump();

XNamespace p = "http://api.namecheap.com/xml.response";
var doc1 = XElement.Parse(myxml);
var x = from n in doc1.Elements(p + "Server")  select n;
x.First().Value.Dump();
var myxml=@”
WEB1-SANDBOX1
namescape.domains.check
--4:00
0.875
";
//myxml.Dump();
XP=”http://api.namecheap.com/xml.response";
var doc1=XElement.Parse(myxml);
var x=doc1中的n。元素(p+“服务器”)选择n;
x、 First().Value.Dump();

既然这是整个文档,那么应该使用什么来代替.substands?有没有办法为所有XDocument设置一个公共名称空间,与其在每次方法调用中都使用它,我还希望得到对此的响应,因为我看到的许多示例从未引用过名称空间,所以我认为它们不是必需的。@Jarek:如果查询只是根,为什么还要为它返回多个值而烦恼呢?您可以使用
doc.subjects(…)
,但如果它始终是根元素,那似乎毫无意义。@themarcuz:它是整个文档中的一个公共名称空间-但无论何时尝试指定要查找的
XName
,您都需要指定整个名称。您总是可以将这些名称提取到静态只读变量中,这可能会使它更可读。。。
var myxml = @"<ApiResponse Status=""OK"" xmlns=""http://api.namecheap.com/xml.response"">
<Server>WEB1-SANDBOX1</Server>
<Errors />
<Warnings />
<RequestedCommand>namecheap.domains.check</RequestedCommand>
<CommandResponse>
    <DomainCheckResult Domain=""google.com"" Available=""false"" />
</CommandResponse>

<GMTTimeDifference>--4:00</GMTTimeDifference>
<ExecutionTime>0.875</ExecutionTime>
</ApiResponse>";

//myxml.Dump();

XNamespace p = "http://api.namecheap.com/xml.response";
var doc1 = XElement.Parse(myxml);
var x = from n in doc1.Elements(p + "Server")  select n;
x.First().Value.Dump();