【问题标题】:Get InnerXML / InnerText from ChildNodes with specific name. Best Practice从具有特定名称的 ChildNodes 获取 InnerXML / InnerText。最佳实践
【发布时间】:2023-03-13 03:15:01
【问题描述】:

我有一个看起来像这样的 XML(缩短)

 <TrainingCenterDatabase>
  <Activities>
    <Activity Sport="Running">
      <Id>2014-04-28T23:54:41.000Z</Id>
      <Lap StartTime="2014-04-28T23:54:41.000Z">
        <TotalTimeSeconds>284.957</TotalTimeSeconds>
        <DistanceMeters>1000.0</DistanceMeters>
        <MaximumSpeed>4.160999774932861</MaximumSpeed>
        <Calories>67</Calories>
        <AverageHeartRateBpm>
           <Value>152</Value>
        </AverageHeartRateBpm>
        <MaximumHeartRateBpm>
           <Value>162</Value>
        </MaximumHeartRateBpm>
        <Intensity>Active</Intensity>
        <TriggerMethod>Manual</TriggerMethod>
  </Lap>
  <Lap>
     SAME STUFF HERE
 </Lap>
</Activity>
  <Activities>
 </TrainingCenterDatabase>

我是这样提取信息的:

        XmlNodeList lapList = doc.GetElementsByTagName("Lap");

        activity = new Activity();

        foreach (XmlNode lap in lapList)
        {
            var split = new Lap
            {
                StartTime = DateTime.Parse(lap.Attributes[0].Value),
                LapDistance = ConvertToDouble(lap.ChildNodes.Item(1).InnerXml),
                LapMaximunSpeed = ConvertToDouble(lap.ChildNodes.Item(2).InnerXml),
                LapCalories = ConvertToInt(lap.ChildNodes.Item(3).InnerXml),
                LapAverageHeartRate = ConvertToInt(lap.ChildNodes.Item(4).InnerText),
                LapMaximumHeartRate = ConvertToInt(lap.ChildNodes.Item(5).InnerText),
            };

我的问题是,有没有办法减少这种错误?喜欢(引用元素名称?):

LapDistance = ConvertToDouble(lap.ChildNodes.Item["DistanceMeters"].InnerXml),

这种情况的最佳做法是什么?

【问题讨论】:

  • 有什么理由不使用 XmlSerialization 或 LINQ to XML?

标签: c# xml serialization xml-parsing


【解决方案1】:

您可以使用 SelectSingleNode() 和适当的 XPath 字符串作为参数来通过节点名称选择子节点,例如:

LapDistance = ConvertToDouble(lap.SelectSingleNode("DistanceMeters").InnerXml)

如果您不确定所有&lt;Lap&gt; 节点是否都有相应的子元素,则需要进行空检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 2019-06-01
    • 1970-01-01
    • 2010-09-05
    • 2011-01-16
    • 2011-12-13
    • 1970-01-01
    相关资源
    最近更新 更多