使用 Linq to XML 的空引用
本文关键字:引用 XML Linq to 使用 | 更新日期: 2023-09-27 18:36:10
我正在制作国家,州下拉列表。
例如:对于特定国家/地区,我将从XML文件中读取该国家/地区的州,下面是我的代码
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
string st = (DropDownList1.SelectedIndex).ToString();
XDocument main = XDocument.Load((Server.MapPath(@"XMLFile1.xml")));
var query = from user in main.Descendants("country")
where st == user.Element("state").Value --//i am getting an error here like object
select user; reference not set to an instance object
DropDownList2.DataSource = query;
DropDownList2.DataBind();
}
OP的XML(Chuck的评论中提供的链接):使用XML绑定下拉列表
如果在 xml 文件中使用命名空间,则以下内容可能会对您有所帮助:
XNamespace ns = "url";// the url is the namespace path for your namespace
var query = from user in main.Descendants("country")
from state in user.Elements("state")
where state.Value == "st"
select user;
根据经验,您最好使用"SelectMany"解决方案来避免检查节点是否存在
var query = from user in main.Descendants("country")
from state in user.Elements("state")
where state.Value == st
select user;
用户。如果节点不存在,元素("状态")将为空(不为空),因此用户节点将不包含在 where 子句中
100% 纯 Linq,无需默认值即可工作
编辑:从查克的答案注释中的xml形状获取新信息,请求可能应该是
var query = from user in main.Descendants("country")
from state in user.Elements("state")
from text in state.Elements("text")
where text.Value == st
select user;
编辑2:我的错,xml没有完全分层...
您需要发布您的 XML,但当前的问题是用户没有子.Element("state")
,因此您正在尝试为该用户引用null.Value
。
此 Xml 库可以帮助您: https://github.com/ChuckSavage/XmlLib/
使用以下代码,您可以获得所需的项目。
string country = "Sri Lanka";
XElement root = XElement.Load(Server.MapPath(@"XMLFile1.xml"));
XElement xcountry = root.XPathElement("//country[.={0}]", country);
或
XElement xcountry = root.Descendants("country")
.FirstOrDefault(user => user.Value == country);
然后
XElement state = (XElement)xcountry.NextNode;
string[] states = state.Elements("text").Select(xtext => xtext.Value).ToArray();
然后,您可能将状态绑定为数据源。