在c#中查找XML节点,忽略其余部分
本文关键字:余部 节点 查找 XML | 更新日期: 2023-09-27 18:07:51
我有一个非常丑陋的应用程序,我从我的PC读取串口,连接到这个串口的设备发送XML数据到这个应用程序…我的应用程序读取XML数据到一个字符串,并在节点<watts>
寻找变量,但一旦设备发送不同的XML数据(历史数据),我的应用程序与该信息崩溃,因为它没有找到节点<watts>
。我只想检查节点是否在那里,忽略不正确的数据。数据来自串行端口到一个名为XMLData的字符串…
正确数据:
<msg>
<src>CC128-v1.34</src>
<dsb>00030</dsb>
<time>21:01:59</time>
<tmpr>18.4</tmpr>
<sensor>0</sensor>
<id>00077</id>
<type>1</type>
<ch1>
<watts>00366</watts>
</ch1>
</msg>
数据不正确:
<msg>
<src>CC128-v1.34</src>
<dsb>00030</dsb>
<time>21:02:00</time>
<hist>
<dsw>00030</dsw>
<type>1</type>
<units>kwhr</units>
<data>
<sensor>0</sensor>
<h650>0.856</h650>
<h648>1.418</h648>
<h646>0.765</h646>
<h644>0.742</h644>
</data>
<data>
<sensor>1</sensor>
<h650>0.000</h650>
<h648>0.000</h648>
<h646>0.000</h646>
<h644>0.000</h644>
</data>
<data>
<sensor>2</sensor>
<h650>0.000</h650>
<h648>0.000</h648>
<h646>0.000</h646>
<h644>0.000</h644>
</data>
</hist>
</msg>
您可以使用LINQ to XML:
var doc = XDocument.Parse(yourXMLString);
var watts = doc.Descendants("watts").Select(x => (string)x).FirstOrDefault();
if (watts == null)
{
// incorrect
}
else
{
// correct
}
它获得watts
节点内容作为字符串。当出现多个<watts>
时,选择第一个
您可以尝试使用XmlTextReader
-它将允许您根据需要从文件中读取尽可能多的行,因此即使您的文件不是正确的XML文档,您也可以获得正确的结果:
var stream = new StreamReader("Input.txt");
string watts = null;
using (var reader = new XmlTextReader(stream))
{
while (reader.Read())
{
if (reader.IsStartElement("watts"))
{
reader.Read();
watts = reader.Value;
break;
}
}
}
对于如此简单的事情,您可以考虑使用正则表达式。我知道,我知道,在html/xml中使用正则表达式是"屈服于黑暗之神克苏鲁的诱惑",但这只是提取一个,也许是多个值,所以我不知道它有什么害处。
另外,它跳过了你得到的那些奇怪的错误,因为它不读取/解析xml。它可以像你想要的那样无效。
生成一个可能的正则表达式:
Regex regex = new Regex("<watts>(?<match>[0-9]+)</watts>");
MatchCollection matches = regex.Matches(sample);
foreach (Match match in matches)
{
Console.WriteLine(match.Groups["match"].Value);
}
下面是正则表达式的分解,以防您(或将来遇到这个问题的任何人)不熟悉它们:
-
<watts>
匹配开始标签 -
(?<match>[0-9]+)
表示命名捕获组,匹配的字符串将存储在match.Groups
中,索引为match
当然, -
[0-9]+
是watts标签中的值。在这种情况下,只有数字,并且至少一个(您可以在+
之后添加?
以使其不贪婪,但我不确定这是否/如何帮助) -
</watts>
匹配结束标签 -
.Matches
方法返回示例字符串 中的所有实例
我不禁注意到在错误的代码,watts
标签是缺失的。这只是你的疏忽吗?您总是可以使regex不仅匹配watts,还匹配在不正确的数据中替换它的任何其他标记。
作为旁注,我不建议使用正则表达式来替代完整的xml阅读器/解析器。但是仅仅从文档中获取几个值似乎有点过分了。