C#のComboBox.SlectedValueとXPathを使用したXMLファイルノード値の比較
-
20-12-2019 - |
質問
これは私のXMLファイルの一部であり、私はXPath Navigatorを使用してXPathナビゲータを使用して、デバイスの名前を含むコンボボックスをフォームにして、数値を下にして、最後に私が買ったボタン。 私がやりたいのは、私がボタンの購入を打つとき私はデバイスノードの数量ノード値がCombo Box SelectedValueに等しく、数値アップ値の数によって増加するようになります。 言い換えれば、その名前を持つデバイス要素の数量ノードをコンボボックス内の名前と同じか、C#。
を使用して、もちろんそれが数値の値でそれを増やすことができますか。<INVENTORY>
<DEVICE ID="1">
<NAME>Air Steerable Bagless Upright</NAME>
<BRAND>Hoover</BRAND>
<MODEL>UH72400</MODEL>
<QUANTITY>23</QUANTITY>
<BUYING_PRICE>189.99</BUYING_PRICE>
<SELLING_PRICE>229.99</SELLING_PRICE>
</DEVICE>
<DEVICE ID="2">
<NAME>Quietforce Bagged Canister</NAME>
<BRAND>Hoover</BRAND>
<MODEL>SH30050</MODEL>
<QUANTITY>18</QUANTITY>
<BUYING_PRICE>299.99</BUYING_PRICE>
<SELLING_PRICE>334.99</SELLING_PRICE>
</DEVICE>
<DEVICE ID="3">
<NAME>Corded Cyclonic Stick Vacuum</NAME>
<BRAND>Hoover</BRAND>
<MODEL>SH20030</MODEL>
<QUANTITY>21</QUANTITY>
<BUYING_PRICE>79.99</BUYING_PRICE>
<SELLING_PRICE>109.99</SELLING_PRICE>
</DEVICE>
. 解決 3
private void button2_Click(object sender, EventArgs e)//Button Buy clicking method
{
XmlDocument inventory = new XmlDocument();
inventory.Load("Inventory.xml");
string vacuumName = (string)vacuumsBox.SelectedItem;//vacuumBox is a comboBox that contains the vacuums names
XmlNode rootElement = inventory.FirstChild.NextSibling;//first child is the xml encoding type tag not the root
int quantity, newQuantity = 0;
foreach (XmlNode device in rootElement.ChildNodes)
{
if (String.Equals(device["NAME"].InnerText, vacuumName))
{
int number = Convert.ToInt32(vacuumsNumber.Value);//vacuumNumber is the name of the numeric up down
quantity = Int32.Parse(device["QUANTITY"].InnerText);
newQuantity = quantity + number;
device["QUANTITY"].InnerText = newQuantity.ToString();//Updating the QUANTITY node value.
inventory.Save("Inventory.xml");
continue;
}
}
. 他のヒント
ええと、この場合、反復アプローチが理解しやすいと思います。私たちがやりたいことはXMLElementを見つけることで、目的のコンテンツを持つ指定された名前要素があります。
XmlDocumentをツリーとして考えるのに役立ちます。この木には異なるノードがあります。最上位のノードはInventory. The
Inventory`ノードである(この場合)3つのデバイスサブノードです。すべてのデバイスサブノードにはサブノード(名前、ブランドなど)があります。その数量を見つけるのは簡単に考えています。木の上に繰り返し、名前要素が検索文字列と一致するかどうかを確認します。そうであれば、数量要素の値を取得します。これは可能な解決策を示す小さなコンソールアプリケーションです。このソリューションは、XMLが十分に形成されていない場合は例外を引き起こす可能性があることに注意してください(たとえば、name要素が見つからない)。
static void Main(string[] args)
{
XmlDocument xdoc = new XmlDocument();
string searchName = "Quietforce Bagged Canister";
xdoc.LoadXml(@"<INVENTORY>
<DEVICE ID='1'>
<NAME>Air Steerable Bagless Upright</NAME>
<BRAND>Hoover</BRAND>
<MODEL>UH72400</MODEL>
<QUANTITY>23</QUANTITY>
<BUYING_PRICE>189.99</BUYING_PRICE>
<SELLING_PRICE>229.99</SELLING_PRICE>
</DEVICE>
<DEVICE ID='2'>
<NAME>Quietforce Bagged Canister</NAME>
<BRAND>Hoover</BRAND>
<MODEL>SH30050</MODEL>
<QUANTITY>18</QUANTITY>
<BUYING_PRICE>299.99</BUYING_PRICE>
<SELLING_PRICE>334.99</SELLING_PRICE>
</DEVICE>
<DEVICE ID='3'>
<NAME>Corded Cyclonic Stick Vacuum</NAME>
<BRAND>Hoover</BRAND>
<MODEL>SH20030</MODEL>
<QUANTITY>21</QUANTITY>
<BUYING_PRICE>79.99</BUYING_PRICE>
<SELLING_PRICE>109.99</SELLING_PRICE>
</DEVICE></INVENTORY>");
//this is the INVENTORY element. You might need to customize that, in case the INVENTORY is not the root
XmlNode rootElement = xdoc.FirstChild;
//-1 means that no mathing item was found.
int quantity = -1;
//Here we iterate over every device element
foreach(XmlNode device in rootElement.ChildNodes)
{
//TODO: Validate XML first. Missing Elements can cause exceptions
//We can access the child elements of the decives with their element name
if(String.Equals(device["NAME"].InnerText, searchName))
{
quantity = Int32.Parse(device["QUANTITY"].InnerText);
break;
}
}
Console.WriteLine(quantity.ToString());
Console.ReadLine();
}
. あなたがSQLにLINQを好むならば、このような何かがうまくいくでしょう。
public string GetXML()
{
return @"<root><DEVICE ID=""1"">
<NAME>Air Steerable Bagless Upright</NAME>
<BRAND>Hoover</BRAND>
<MODEL>UH72400</MODEL>
<QUANTITY>23</QUANTITY>
<BUYING_PRICE>189.99</BUYING_PRICE>
<SELLING_PRICE>229.99</SELLING_PRICE>
</DEVICE>
<DEVICE ID=""2"">
<NAME>Quietforce Bagged Canister</NAME>
<BRAND>Hoover</BRAND>
<MODEL>SH30050</MODEL>
<QUANTITY>18</QUANTITY>
<BUYING_PRICE>299.99</BUYING_PRICE>
<SELLING_PRICE>334.99</SELLING_PRICE>
</DEVICE>
<DEVICE ID=""3"">
<NAME>Corded Cyclonic Stick Vacuum</NAME>
<BRAND>Hoover</BRAND>
<MODEL>SH20030</MODEL>
<QUANTITY>21</QUANTITY>
<BUYING_PRICE>79.99</BUYING_PRICE>
<SELLING_PRICE>109.99</SELLING_PRICE>
</DEVICE></root>";
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
///this would be your up down control
var xml = XDocument.Parse(GetXML());
var device = xml.Descendants("DEVICE").Where(d => d.Descendants("NAME").First().Value == "Air Steerable Bagless Upright");
var quantity = Convert.ToInt16(device.Descendants("QUANTITY").First().Value);
quantity++;
device.Descendants("QUANTITY").First().Value = quantity.ToString();
xml.Save(@"c:\temp\temp.xml");
}
. 所属していません StackOverflow