我对XML有些困惑!我的xml文件在下面给出
<rootnode>
<childnode id="1" quantity="3" type="auto">0000-000</childnode>
<childnode id="2" quantity="3" type="prop">1111-111</childnode>
<childnode id="2" quantity="3" type="toy">2222-222</childnode>
<childnode id="3" quantity="3" type="auto">0000-000</childnode>
</rootnode>
我正在创建一个函数,它将两个参数作为属性和属性值的数组。现在我有点混淆如何将节点的每个属性相互比较?瞥一眼我的代码
ComparableAttributes = new string[]{ "id","quantity"};
ComparableAttributesValue = new string[]{ "2","3"};
根据我的要求,我必须有两个节点(第二和第三)。因为属性和属性值与该特定节点匹配!
public List<XmlNode> getXmlNodeList()
{
XmlDocument Xdoc = new XmlDocument();
Xdoc.Load(Filename);
List<XmlNode> xmlList = new List<XmlNode>();
foreach (XmlNode node in Xdoc.SelectNodes("//" + Childnode))
{
for (int i = 0; i < ComparableAttributes.Count() - 1; i++)
{
if (node.Attributes[ComparableAttributes[i]].Value == ComparableAttributesValue[i] &&
node.Attributes[ComparableAttributes[i + 1]].Value == ComparableAttributesValue[i + 1])
xmlList.Add(node);
}
}
return xmlList;
}
它只给出了两个值的输出......!如果我想让它变得动态,那么我如何迭代循环?我的意思是我怎么能忍受这个条件!我有点困惑!
答案 0 :(得分:1)
你几乎完全正确。有一些小问题:
for (int i = 0; i < ComparableAttributes.Count() - 1; i++)
假设ComparableAttributes.Count()
为5
。然后,此循环将为i
,0
,1
,2
提供值3
,然后停止。但这省略了4
!在这里迭代的正确方法是
for (int i = 0; i < ComparableAttributes.Count(); i++)
OR
for (int i = 0; i <= ComparableAttributes.Count() - 1; i++)
下一个问题是,在i
循环中,您正在测试两个索引,i
和i+1
- 我怀疑您将其放入,因为你的例子你只绕过一次循环。
最后,最重要的是,如果任何的魔法属性都是正确的,那么你现在正在接受一个节点,但听起来你只想接受一个节点 all < / em>的魔法属性是正确的。为此,我们需要引入一个新变量来跟踪节点是否良好,并确保检查我们需要的每个属性。
我们最终得到的结果如下:
foreach (XmlNode node in Xdoc.SelectNodes("//" + Childnode))
{
bool nodeIsGood = true;
for (int i = 0; i < ComparableAttributes.Count(); i++)
{
if (node.Attributes[ComparableAttributes[i]].Value
!= ComparableAttributesValue[i])
{
// the attribute doesn't have the required value
// so this node is no good
nodeIsGood = false;
// and there's no point checking any more attributes
break;
}
}
if (nodeIsGood)
xmlList.Add(node);
}
给它一个去看看它是否有效。