XML内容的一部分:
<section name="Header">
<placeholder name="HeaderPane"></placeholder>
</section>
<section name="Middle" split="20">
<placeholder name="ContentLeft" ></placeholder>
<placeholder name="ContentMiddle"></placeholder>
<placeholder name="ContentRight"></placeholder>
</section>
<section name="Bottom">
<placeholder name="BottomPane"></placeholder>
</section>
我想检查每个节点,如果存在属性split
,请尝试在变量中指定属性值。
在循环中,我尝试:
foreach (XmlNode xNode in nodeListName)
{
if(xNode.ParentNode.Attributes["split"].Value != "")
{
parentSplit = xNode.ParentNode.Attributes["split"].Value;
}
}
但是如果条件仅检查值而不检查属性的存在,那我就错了。我该如何检查属性是否存在?
答案 0 :(得分:40)
您实际上可以直接索引到Attributes集合中(如果您使用的是C#而不是VB):
foreach (XmlNode xNode in nodeListName)
{
XmlNode parent = xNode.ParentNode;
if (parent.Attributes != null
&& parent.Attributes["split"] != null)
{
parentSplit = parent.Attributes["split"].Value;
}
}
答案 1 :(得分:8)
如果您的代码正在处理XmlElements
个对象(而不是XmlNodes
),那么就会有方法XmlElement.HasAttribute(string name)。
因此,如果您只是在元素上寻找属性(从OP看起来像这样),那么作为元素进行强制转换可能会更强大,检查null,然后使用HasAttribute方法。
foreach (XmlNode xNode in nodeListName)
{
XmlElement xParentEle = xNode.ParentNode as XmlElement;
if((xParentEle != null) && xParentEle.HasAttribute("split"))
{
parentSplit = xParentEle.Attributes["split"].Value;
}
}
答案 2 :(得分:7)
您可以使用LINQ to XML,
XDocument doc = XDocument.Load(file);
var result = (from ele in doc.Descendants("section")
select ele).ToList();
foreach (var t in result)
{
if (t.Attributes("split").Count() != 0)
{
// Exist
}
// Suggestion from @UrbanEsc
if(t.Attributes("split").Any())
{
}
}
OR
XDocument doc = XDocument.Load(file);
var result = (from ele in doc.Descendants("section").Attributes("split")
select ele).ToList();
foreach (var t in result)
{
// Response.Write("<br/>" + t.Value);
}
答案 3 :(得分:4)
仅供新手使用:最新版本的C#允许使用?
运算符检查空值分配
parentSplit = xNode.ParentNode.Attributes["split"]?.Value;
答案 4 :(得分:3)
修改强>
无视 - 你不能使用ItemOf(这是我在测试前输入的内容)。如果我能弄清楚如何......或者我只是删除答案,我会删除文本,因为它最终是错误的和没用的。
结束编辑
您可以使用XmlAttributesCollection中的ItemOf(string)
属性来查看该属性是否存在。如果找不到它,则返回null。
foreach (XmlNode xNode in nodeListName)
{
if (xNode.ParentNode.Attributes.ItemOf["split"] != null)
{
parentSplit = xNode.ParentNode.Attributes["split"].Value;
}
}
答案 5 :(得分:2)
var splitEle = xn.Attributes["split"];
if (splitEle !=null){
return splitEle .Value;
}
答案 6 :(得分:1)
处理这种情况的另一种方法是异常处理。
每次调用不存在的值时,您的代码都将从异常中恢复,并继续循环。在catch-block中,当表达式(...!= null)返回false时,您可以像在else语句中将其写下来一样处理错误。当然,抛出和处理异常是一项相对昂贵的操作,根据性能要求可能并不理想。
答案 7 :(得分:1)
您可以使用GetNamedItem方法检查属性是否可用。如果返回null,则它不可用。以下是您检查的代码:
foreach (XmlNode xNode in nodeListName)
{
if(xNode.ParentNode.Attributes.GetNamedItem("split") != null )
{
if(xNode.ParentNode.Attributes["split"].Value != "")
{
parentSplit = xNode.ParentNode.Attributes["split"].Value;
}
}
}