首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按属性检索XML值

按属性检索XML值
EN

Stack Overflow用户
提问于 2022-09-30 08:24:10
回答 2查看 78关注 0票数 0
代码语言:javascript
复制
public string[] UnpackXML(string xml_string)
{
    string response = xml_string;
    string[] return_values = new string[6];

    XmlDocument xml = new XmlDocument();
    xml.LoadXml(response);

    return_values[0] = xml.GetElementsByTagName("meas name=\"mt1\"")[0].InnerText.ToString();
    return_values[1] = xml.GetElementsByTagName("meas name=\"mt2\"")[0].InnerText.ToString();
    return_values[2] = xml.GetElementsByTagName("meas name=\"mt3\"")[0].InnerText.ToString();
    return_values[3] = xml.GetElementsByTagName("meas name=\"mt4\"")[0].InnerText.ToString();
    return_values[4] = xml.GetElementsByTagName("meas name=\"mt5\"")[0].InnerText.ToString();
    return_values[5] = xml.GetElementsByTagName("meas name=\"mt6\"")[0].InnerText.ToString();

    return return_values;
}

当运行上述代码时,给定的错误代码将失败:

System.NullReferenceException:“对象引用未设置为对象的实例。”

在第一行中,我尝试给return_values[0]一个新的值:

代码语言:javascript
复制
return_values[0] = xml.GetElementsByTagName("meas name=\"mt1\"")[0].InnerText.ToString();

UnpackXML的输入只是一个作为XML提供的API响应。XML文档的格式如下:

代码语言:javascript
复制
<response location='location1'>
    <meas name='mt1'>14</meas>
    <meas name='mt2'>23</meas>
    <meas name='mt3'>65</meas>
    <meas name='mt4'>31</meas>
    <meas name='mt6'>32</meas>
</response>

有什么办法解决这个问题吗?基本上,我希望将XML文件中的特定字段附加到数组中。XML属性"name“与每一行一起存在,并对属性具有不同的值。是否有一种方法可以通过提供正确的name = "nameValue"直接访问属性值,而无需遍历属性和检查每个特定的值?

EN

Stack Overflow用户

回答已采纳

发布于 2022-09-30 08:40:44

.GetElementsByTagName()不适合您的场景,因为您使用的是XPath,而不仅仅是标记名。

相反,您应该使用.SelectNodes().SelectSingleNode()

代码语言:javascript
复制
return_values[0] = xml.SelectNodes("//meas[@name=\"mt1\"]")[0]?.InnerText.ToString();
return_values[1] = xml.SelectNodes("//meas[@name=\"mt2\"]")[0]?.InnerText.ToString();
return_values[2] = xml.SelectNodes("//meas[@name=\"mt3\"]")[0]?.InnerText.ToString();
return_values[3] = xml.SelectNodes("//meas[@name=\"mt4\"]")[0]?.InnerText.ToString();
return_values[4] = xml.SelectNodes("//meas[@name=\"mt5\"]")[0]?.InnerText.ToString();
return_values[5] = xml.SelectNodes("//meas[@name=\"mt6\"]")[0]?.InnerText.ToString();

代码语言:javascript
复制
xml.SelectSingleNode("//meas[@name=\"mt1\"]")?.InnerText.ToString();

Demo @ .NET Fiddle

此外,使用空条件运算符?.处理返回的节点是可能的,以防止null引用异常(NRE)。

关于动态方式的进一步问题,而不是硬代码(假设6个名称,您需要编写6次语句),您可以使用循环和LINQ通过匹配属性值获得节点的InnerText,如下所示:

代码语言:javascript
复制
string[] return_values = new string[6];
string[] names = new string[6] { "mt1", "mt2", "mt3", "mt4", "mt5", "mt6" };
XmlDocument xml = new XmlDocument();
xml.LoadXml(response);
        
for (int i = 0; i < return_values.Count(); i++)
{
    var node = xml.DocumentElement
        .ChildNodes
        .Cast<XmlNode>()
        .FirstOrDefault(x => x.Attributes["name"].Value == names[i]);
    return_values[i] = node?.InnerText.ToString();
}

代码语言:javascript
复制
for (int i = 0; i < return_values.Count(); i++)
{
    return_values[i] = xml.SelectSingleNode($"//meas[@name=\"{names[i]}\"]")?.InnerText.ToString();
}

Demo @ .NET Fiddle

票数 4
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73905913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档