[英]Check XML node have attribute name with specific value - Parse XML using Linq
First I apologize for creating a new question about XML parsing using Linq 首先,我为使用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>
I am trying to check nav
tag having the attribute epub:type
with value toc
& which get into & 我正在尝试检查具有属性epub:type
nav
标签epub:type
值为toc
&进入&
To achieve this I started to get the <nav>
tag which having attreibute epub:type
with value toc
为了实现这一点,我开始获得<nav>
标签,该标签具有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. 但每次result
计数为零。 I wonder what is the wrong in my XML. 我想知道我的XML有什么问题。
Can you please suggest me right way. 能否请你正确的方式。
Thanks. 谢谢。
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"
. 您正在寻找nav
元素而不指定命名空间,但默认命名空间是"http://www.w3.org/1999/xhtml"
。 Additionally, you're looking for your epub attributes in the wrong way. 此外,您正在以错误的方式查找您的epub属性。
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: 或者,如果要修改if
语句中的结果,只需在Descendants
调用结束时调用.ToList()
:
foreach (var t in xDoc.Descendants(ns + "nav").ToList())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.