0

First I apologize for creating a new question about XML parsing using Linq

<?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>

I am trying to check nav tag having the attribute epub:type with value toc & which get into &

  • tags collect all tag info.

    To achieve this I started to get the <nav> tag which having attreibute epub:type with value 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;
                }
            }
    

    But every time the result count is zero. I wonder what is the wrong in my XML.

    Can you please suggest me right way.

    Thanks.

    1 Answer 1

    2

    This is a namespace problem. You're looking for nav elements without specifying a namespace, but the default namespace is "http://www.w3.org/1999/xhtml". Additionally, you're looking for your epub attributes in the wrong way.

    I suggest you change your code to:

    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
        }
    }
    

    Or if you want to modify the result in your if statement, just call .ToList() at the end of the Descendants call:

    foreach (var t in xDoc.Descendants(ns + "nav").ToList())
    
    Sign up to request clarification or add additional context in comments.

    Comments

    Your Answer

    By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

    Start asking to get answers

    Find the answer to your question by asking.

    Ask question

    Explore related questions

    See similar questions with these tags.