检查XML节点具有特定值的属性名称 - 使用Linq解析XML

时间:2014-02-06 12:29:44

标签: c# xml linq parsing

首先,我为使用Linq创建一个关于XML解析的新问题而道歉

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
    xmlns:epub="http://www.idpf.org/2007/ops">
    <head>
        <meta charset="utf-8"></meta>       
        <link rel="stylesheet" type="text/css" href="epub.css"/> 
    </head>
    <body>
        <nav epub:type="toc" id="toc">          
            <ol>
                <li>
                    <a href="text.xhtml">The System</a>
                </li>   
                    <li>
                    <a href="text1.xhtml">The Option</a>
                </li>   
            </ol>           
        </nav>
           <nav epub:type="landmarks" id="guide">
            .......
            .......
           </nav>
    </body>
</html>

我正在尝试检查nav标记,其属性epub:type的值为toc&amp;进入&amp;

  • 标签收集所有标签信息。

    为实现这一目标,我开始获取<nav>标记,该标记具有值为epub:type的attreibute toc

            var xDoc = XDocument.Load("nav.xhtml");
            var result = (from ele in xDoc.Descendants("nav") select ele).ToList();
    
            foreach (var t in result)
            {
                if (t.Attributes("epub:type").Any())
                {
                    var dev = t.Attribute("epub:type").Value;
                }
            }
    

    但每次result计数为零。我想知道我的XML有什么问题。

    你能建议我正确吗?

    感谢。

  • 1 个答案:

    答案 0 :(得分:2)

    这是命名空间问题。您正在查找nav元素而未指定名称空间,但默认名称空间为"http://www.w3.org/1999/xhtml"。此外,您正在以错误的方式查找您的epub属性。

    我建议您将代码更改为:

    var xDoc = XDocument.Load("nav.xhtml");
    XNamespace ns = "http://www.w3.org/1999/xhtml";
    XNamespace epub = "http://www.idpf.org/2007/ops";
    
    foreach (var t in xDoc.Descendants(ns + "nav"))
    {
        var attribute = t.Attribute(epub + "type");
        if (attribute != null)
        {
            ... use the attribute
        }
    }
    

    或者,如果您想在if声明中修改结果,只需在.ToList()电话结束时致电Descendants

    foreach (var t in xDoc.Descendants(ns + "nav").ToList())