LINQ Xelement查询存在子节点时返回null

8
我有一个像这样的XML文件,我想读取ID、shortname和Name节点的值。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<AccountingUnitList xmlns="http://www.google.com">
<AccountingUnit>
<ID>17406</ID> 
<ShortName>test</ShortName> 
<Name>test</Name> 
</AccountingUnit>
<AccountingUnit>
<ID>18006</ID> 
<ShortName>ANOTHERtest</ShortName> 
<Name>Anothertest</Name> 
</AccountingUnit>
<AccountingUnit>
<ID>18046</ID> 
<ShortName>RKU</ShortName>
<Name>hospital</Name> 
</AccountingUnit>
<AccountingUnit>
<ID>18047</ID> 
<ShortName>MNU</ShortName> 
<Name>MNU</Name> 
</AccountingUnit>
</AccountingUnitList>

什么是递归读取Node元素的最佳方法?
这就是我尝试读取节点值的方式:
var accountingunit = ( 
                from e in XDocument.Parse(textresult).Root.Elements("AccountingUnit")
                select new node
                {
                     idvalue = (string)e.Element("ID"),
                     shortname =(string)e.Element("ShortName"),
                     name = (string)e.Element("Name"),

                });

            foreach(var unit in accountingunit)
            {
               Console.WriteLine("ID"+ unit.idvalue + unit.name + unit.shortname);
            }

这里是节点构造器:

public class node
{
    public string idvalue { get; set; }
    public string shortname { get; set; }
    public string name { get; set; }
}

3
请展示您所尝试的内容。 - Sybren
通过一些谷歌搜索,你可以找到答案。https://dev59.com/tmUq5IYBdhLWcg3wbv5Zhttps://dev59.com/R2oy5IYBdhLWcg3wkO-hhttps://dev59.com/V3RB5IYBdhLWcg3wn4jchttps://social.msdn.microsoft.com/forums/vstudio/en-US/3d457c3b-292c-49e1-9fd4-9b6a950f9010/how-to-get-tag-name-of-xml-by-using-xdocument - James Shaw
添加递归一词,您将获得更多的内容!http://www.codearsenal.net/2012/12/csharp-reading-xml-document-recursively.htmlhttp://forums.asp.net/t/1535653.aspx?Traversing+XML+file+using+recursionhttp://ehikioya.com/get-xml-document-nodes-recursively/ - James Shaw
1个回答

17

您的文档中有一个XML命名空间。所有AccountingUnitList的子元素都继承了命名空间,因此您需要通过元素名称指定它:

您的文档中有一个 XML 命名空间。所有 AccountingUnitList 的子元素都会继承该命名空间,因此您需要通过元素名称来指定它:

XNamespace ns = "http://www.google.com";

var accountingunit = ( 
            from e in XDocument.Parse(textresult).Elements(ns + "AccountingUnit")
            select new node
            {
                 idvalue = (string)e.Element(ns + "ID"),
                 shortname =(string)e.Element(ns + "ShortName"),
                 name = (string)e.Element(ns + "Name"),

            });

@user1514428 尝试移除 .Root。由于您正在使用 XElement.Parse,根元素已经是 AccountingUnitList - Selman Genç
@user1514428 看起来我在这里漏掉了命名空间:.Elements(ns + "AccountingUnit") 再试一次。 - Selman Genç
非常感谢,它起作用了,但我有一个问题。实际上,XML是所有会计单位的Web服务请求的结果,但如果我请求一个特定的会计单位ID,则XML如下所示: <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <AccountingUnit xmlns="http://www.google.com"> <ID>10000</ID> <ShortName>TEST KH 01</ShortName> <Name>ORBIS TEST-Krankenhaus 01</Name> <FinancialAccountSystem>1</FinancialAccountSystem> </AccountingUnit> 我该怎么做? - user1514428
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - user1514428
@user1514428 看起来你的问题需要一个新的提问,请仅使用评论来请求更多细节。此外,如果这个问题对你有帮助,请将其标记为绿色。 - M. Haché

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接