使用 C# 从 XML 给定条件获取值
Getting values from XML with conditions given using C#
我对在 C# 中使用 XML 有点陌生。
XML 代码:
<LVL2>
<Tables>
<TBL_ID>1</TBL_ID>
<TBL_Name>test1</TBL_Name>
<MD_ID>1</MD_ID>
<Tables>
<Tables>
<TBL_ID>2</TBL_ID>
<TBL_Name>test2</TBL_Name>
<MD_ID>1</MD_ID>
</Tables>
<Tables>
<TBL_ID>3</TBL_ID>
<TBL_Name>test3</TBL_Name>
<MD_ID>1</MD_ID>
</Tables>
</LVL2>
<LVL2>
<Tables>
<TBL_ID>1</TBL_ID>
<TBL_Name>test4</TBL_Name>
<MD_ID>2</MD_ID>
</Tables>
<Tables>
<TBL_ID>2</TBL_ID>
<TBL_Name>test5</TBL_Name>
<MD_ID>2</MD_ID>
</Tables>
<Tables>
<TBL_ID>3</TBL_ID>
<TBL_Name>test6</TBL_Name>
<MD_ID>2</MD_ID>
</Tables>
</LVL2>
如何将 tbl_name
中只有 md_id = 1
的文本值插入到选中列表框中。这是我当前的代码。
while (xmlReader.Read())
{
switch (xmlReader.NodeType)
{
case XmlNodeType.Element:
elName = xmlReader.Name;
break;
case XmlNodeType.Text:
if (elName == "TBL_Name" && MD_ID == "1")
{
checkedListBox2.Items.Add(xmlReader.Value);
}
break;
}
}
我似乎无法弄清楚如何获取具有 MD_ID = "1"
和输出的文本:
test4
test5
test6
首先,xml格式不正确。它应该包含一个根节点,而您错过了 <Tables>
标记的结束。在示例示例中,如果要选择具有 "MD_ID = 1" 的元素的 table 名称,结果将是:
test1
test2
test3
如果你想要o/p如你所说,那么条件将不等于1。
这是解决方案:
string xmlInput = @"
<root>
<LVL2>
<Tables>
<TBL_ID>1</TBL_ID>
<TBL_Name>test1</TBL_Name>
<MD_ID>1</MD_ID>
</Tables>
<Tables>
<TBL_ID>2</TBL_ID>
<TBL_Name>test2</TBL_Name>
<MD_ID>1</MD_ID>
</Tables>
<Tables>
<TBL_ID>3</TBL_ID>
<TBL_Name>test3</TBL_Name>
<MD_ID>1</MD_ID>
</Tables>
</LVL2>
<LVL2>
<Tables>
<TBL_ID>1</TBL_ID>
<TBL_Name>test4</TBL_Name>
<MD_ID>2</MD_ID>
</Tables>
<Tables>
<TBL_ID>2</TBL_ID>
<TBL_Name>test5</TBL_Name>
<MD_ID>2</MD_ID>
</Tables>
<Tables>
<TBL_ID>3</TBL_ID>
<TBL_Name>test6</TBL_Name>
<MD_ID>2</MD_ID>
</Tables>
</LVL2>
</root>";
XDocument xdoc = XDocument.Parse(xmlInput);
var filteredXML =
xdoc.Descendants("root")
.Elements("LVL2")
.Elements("Tables")
.Where(x => string.Compare(x.Element("MD_ID").Value, "1") == 0)
.Select(x => x.Element("TBL_Name").Value)
.ToList();
Console.WriteLine(filteredXML);
引用以下命名空间:
using System.Xml.Linq;
我对在 C# 中使用 XML 有点陌生。
XML 代码:
<LVL2>
<Tables>
<TBL_ID>1</TBL_ID>
<TBL_Name>test1</TBL_Name>
<MD_ID>1</MD_ID>
<Tables>
<Tables>
<TBL_ID>2</TBL_ID>
<TBL_Name>test2</TBL_Name>
<MD_ID>1</MD_ID>
</Tables>
<Tables>
<TBL_ID>3</TBL_ID>
<TBL_Name>test3</TBL_Name>
<MD_ID>1</MD_ID>
</Tables>
</LVL2>
<LVL2>
<Tables>
<TBL_ID>1</TBL_ID>
<TBL_Name>test4</TBL_Name>
<MD_ID>2</MD_ID>
</Tables>
<Tables>
<TBL_ID>2</TBL_ID>
<TBL_Name>test5</TBL_Name>
<MD_ID>2</MD_ID>
</Tables>
<Tables>
<TBL_ID>3</TBL_ID>
<TBL_Name>test6</TBL_Name>
<MD_ID>2</MD_ID>
</Tables>
</LVL2>
如何将 tbl_name
中只有 md_id = 1
的文本值插入到选中列表框中。这是我当前的代码。
while (xmlReader.Read())
{
switch (xmlReader.NodeType)
{
case XmlNodeType.Element:
elName = xmlReader.Name;
break;
case XmlNodeType.Text:
if (elName == "TBL_Name" && MD_ID == "1")
{
checkedListBox2.Items.Add(xmlReader.Value);
}
break;
}
}
我似乎无法弄清楚如何获取具有 MD_ID = "1"
和输出的文本:
test4
test5
test6
首先,xml格式不正确。它应该包含一个根节点,而您错过了 <Tables>
标记的结束。在示例示例中,如果要选择具有 "MD_ID = 1" 的元素的 table 名称,结果将是:
test1
test2
test3
如果你想要o/p如你所说,那么条件将不等于1。 这是解决方案:
string xmlInput = @"
<root>
<LVL2>
<Tables>
<TBL_ID>1</TBL_ID>
<TBL_Name>test1</TBL_Name>
<MD_ID>1</MD_ID>
</Tables>
<Tables>
<TBL_ID>2</TBL_ID>
<TBL_Name>test2</TBL_Name>
<MD_ID>1</MD_ID>
</Tables>
<Tables>
<TBL_ID>3</TBL_ID>
<TBL_Name>test3</TBL_Name>
<MD_ID>1</MD_ID>
</Tables>
</LVL2>
<LVL2>
<Tables>
<TBL_ID>1</TBL_ID>
<TBL_Name>test4</TBL_Name>
<MD_ID>2</MD_ID>
</Tables>
<Tables>
<TBL_ID>2</TBL_ID>
<TBL_Name>test5</TBL_Name>
<MD_ID>2</MD_ID>
</Tables>
<Tables>
<TBL_ID>3</TBL_ID>
<TBL_Name>test6</TBL_Name>
<MD_ID>2</MD_ID>
</Tables>
</LVL2>
</root>";
XDocument xdoc = XDocument.Parse(xmlInput);
var filteredXML =
xdoc.Descendants("root")
.Elements("LVL2")
.Elements("Tables")
.Where(x => string.Compare(x.Element("MD_ID").Value, "1") == 0)
.Select(x => x.Element("TBL_Name").Value)
.ToList();
Console.WriteLine(filteredXML);
引用以下命名空间:
using System.Xml.Linq;