【问题标题】:Reading single element innertext from large xml file从大型 xml 文件中读取单个元素的内部文本
【发布时间】:2020-07-31 13:42:14
【问题描述】:

我有一个大的单节点 .xml 文件,已保存为字符串。我想解析 .xml 文件以读取特定元素并输出内部文本。 EG:我想读取 FrameNo 元素并将 BINGO 输出到消息框。所需的元素只会在 .xml 文档中出现一次。我更喜欢使用 XmlDocument。

我尝试了许多 C# .xml 示例,但无法获得输出。

xml 文本是

    <Aircraft z:Id="i1" xmlns="http://xxx.yyyyycontract.gov/2018/03/Boeing.xxxxxxxxxxxxxx.Airframe" 
    xmlns:i="http://www.xxxxxxx.com/2019/XMLSchema-instance" 
    xmlns:z="http://xxxxxxx.xxxxxxxxx.com/2005/01/Serialization/"><Timestamp i:nil="true"/> 
    <Uuid>00000000-0000-0000-0000-000000000000</Uuid><Comments i:nil="true"/><Facility>..........

以此类推到.xml的结尾

    <FrameNo>BINGO</FrameNo><WDate i:nil="true"/></Aircraft>

这是我想要执行代码的代码部分。

    private void buttonLoad_Click(object sender, EventArgs e)
    {
    }

【问题讨论】:

  • XmlDocument doc = new XmlDocument(); 然后使用 doc.Load(filePath); 加载您的 XML 文件,然后使用 string text = doc.DocumentElement.SelectSingleNode("FrameNo").InnerText

标签: c# xml innertext


【解决方案1】:

我认为,这是不言自明的

using System.Xml.Linq;

XElement root = XElement.Load(textXML);
XElement myElement = root.Element("FrameNo");
if (myElement != null)
    myData = myElement.InnerText;

【讨论】:

    【解决方案2】:

    感谢 jdweng,我想分享最终代码供其他人使用。这将在下面的方法中起作用

        private void buttonMaint_Click(object sender, EventArgs e)
        {
        XDocument doc = XDocument.Parse(xmlinputstr); // input string from memory or input file
        XNamespace ns = doc.Root.GetDefaultNamespace();
                    string[] Frame = doc.Descendants(ns + "FrameNo").Select(x => (string)x).ToArray(); // selects element to read + trailing character of >
        string frame = string.Join("", Frame); //converts from array to string
        if (string.IsNullOrEmpty(frame)) // check for empty result
        {
        txtFrame.Text = "not found"; //outputs to textbox
        }
        else
        {
        txtFrame.Text = (frame); //outputs to textbox
        }
        }
    

    为了清楚起见,这里有评论

    【讨论】:

      【解决方案3】:

      您需要使用默认命名空间。请参阅下面的我的 xml linq 解决方案:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Xml;
      using System.Xml.Linq;
      using System.IO;
      
      namespace ConsoleApplication1
      {
          class Program
          {
              const string FILENAME = @"c:\temp\test.xml";
              static void Main(string[] args)
              {
                  string xml = File.ReadAllText(FILENAME);
                  XDocument doc = XDocument.Parse(xml);
                  XNamespace ns = doc.Root.GetDefaultNamespace();
      
                  XElement frameNo = doc.Descendants(ns + "FrameNo").FirstOrDefault();
      
                  string frame = (string)frameNo;
                  string[] serialNumbers = doc.Descendants(ns + "SerialNumber").Select(x => (string)x).ToArray(); 
      
              }
          }
      }
      

      【讨论】:

      • 它 100% 工作我遇到了一个意想不到的问题,其中一些元素被配置为这样 并且我想要这个元素中的值 197 -15472-145-1990413 我已经尝试了我能想到的一切来编辑或更改“xxxxxx”中的值以包含或排除空格或尾随 >,但没有运气。我知道导致问题的第一个示例中的空间。无论如何要过滤或检查“xxxxxxx”中或之后的尾随字符,以便我只得到 内部文本
      • string[] serialNumbers = doc.Descendants(ns + "SerialNumber").Select(x => (string)x).ToArray();
      • 再次完美运行。我现在有我想要的程序运行。我在代码 cmets 中添加了对您的特别感谢。 // 特别感谢 stackoverflow.com 的 jdweng 提供必要的编码帮助
      【解决方案4】:

      另一个奇怪的障碍出现了。有些元素是这样命名的。

          <a:SupplierServDoc>
      

      此元素的内部文本内容是一个 base64 数据包。处理base64包没有问题。

      上述答案中的代码确实正确输出了 base64,但无法处理元素名称中的 :。它会引发 3A 十六进制字符错误。

      我有这段代码输出intertext,但不是base64数据包。我还研究了处理 : 的前缀,但结果更差。完成后,我将 base 64 内文输出为 .txt 文件。

          XNamespace ad = http://www.mmmmmmmmmm.com";
          XName k = ad + "SupplierServDoc";
          string[] WING = doc.Descendants(k).Select(x => (string)x).ToArray();
          string wing = string.Join("", WING);
          if (string.IsNullOrEmpty(syncd))
          {
          MessageBox.Show("a:SupplierServDoc Base 64 code not found");
          }
          else
          {           
          MessageBox.Show("Test " + wing);
          }
      

      【讨论】:

        猜你喜欢
        • 2013-10-15
        • 1970-01-01
        • 2020-06-30
        • 2013-10-06
        • 2019-12-28
        • 2017-06-26
        • 2013-06-07
        相关资源
        最近更新 更多