如何检查XML中是否存在特定属性
本文关键字:存在 是否 属性 XML 何检查 检查 | 更新日期: 2023-09-27 18:06:31
部分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;
}
}
但是如果条件只检查值,而不检查属性的存在,我就错了。如何检查属性是否存在?
你可以直接索引属性集合(如果你使用c#而不是VB):
foreach (XmlNode xNode in nodeListName)
{
XmlNode parent = xNode.ParentNode;
if (parent.Attributes != null
&& parent.Attributes["split"] != null)
{
parentSplit = parent.Attributes["split"].Value;
}
}
如果您的代码处理的是XmlElements
对象(而不是XmlNodes
),那么就有XmlElement方法。HasAttribute(字符串名称).
所以,如果你只是寻找元素的属性(它看起来像从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;
}
}
仅供新手使用:最新版本的c#允许使用?
操作符检查空赋值
parentSplit = xNode.ParentNode.Attributes["split"]?.Value;
您可以使用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())
{
}
}
或
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);
}
var splitEle = xn.Attributes["split"];
if (splitEle !=null){
return splitEle .Value;
}
EDIT
无视-你不能使用ItemOf(这是我在测试之前输入的)。如果我能想出怎么把这篇文章划掉的话,我会把它划掉的。或者我干脆把答案删掉,因为它最终是错误的,而且毫无用处。
结束编辑
可以使用XmlAttributesCollection中的ItemOf(string)
属性来查看该属性是否存在。如果没有找到,则返回null。
foreach (XmlNode xNode in nodeListName)
{
if (xNode.ParentNode.Attributes.ItemOf["split"] != null)
{
parentSplit = xNode.ParentNode.Attributes["split"].Value;
}
}
XmlAttributeCollection。ItemOf Property (String)
您可以使用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;
}
}
}
处理这种情况的另一种方法是异常处理。
每次调用不存在的值时,代码将从异常中恢复并继续循环。在catch块中,你可以像在else语句中一样处理错误,当表达式(…= null)返回false。当然,抛出和处理异常是一个相对昂贵的操作,根据性能要求,这可能不是理想的。