我对 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;
}
它只为我提供两个值的输出...!如果我想让它动态化,我该如何迭代循环?我的意思是我怎么能提出条件!我只是有点困惑!
最佳答案
你几乎完全正确。还有一些小问题:
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++)
或
for (int i = 0; i <= ComparableAttributes.Count() - 1; i++)
下一个问题是,在 i 循环中,您正在测试 两个 索引,i 和 i+1-我怀疑你把它放进去是因为在你的例子中你只循环了一次。
最后,也是最重要的是,如果 任何 的魔法属性都是正确的,那么目前您正在接受一个节点,但听起来您只想接受一个节点,如果所有 的魔法属性是正确的。为此,我们需要引入一个新变量来跟踪节点是否良好,并确保检查我们需要的每个属性。
我们最终得到的结果是这样的:
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);
}
试一试,看看它是否有效。
关于c# - xml属性与属性值比较的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9005425/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.