【问题标题】:How can I get all text nodes from XML file如何从 XML 文件中获取所有文本节点
【发布时间】:2012-08-23 16:22:13
【问题描述】:

我想从一个 XML 文件中获取所有文本节点。

我该怎么做?

示例输入:

<root>
<slide>
<Image>hi</Image>
<ImageContent>this</ImageContent>
<Thumbnail>is</Thumbnail>
<ThumbnailContent>A</ThumbnailContent>
</slide>
</root> 

预期输出:

hi this is A

【问题讨论】:

  • 使用 XML 解析器解决这个问题

标签: c# xml


【解决方案1】:

枚举任何xml中所有文本节点的唯一解决方案(到目前为止),无论其结构如何:

string input = @"
    <root>
        <slide>
            <Image>hi</Image>
            <ImageContent>this</ImageContent>
            <Thumbnail>is</Thumbnail>
            <ThumbnailContent>A</ThumbnailContent>
        </slide>
    </root>";

foreach (XText text in (IEnumerable)XDocument.Parse(input).XPathEvaluate("//*/text()"))
{
    Console.WriteLine(text.Value);
}

编辑:如果您想从文件中加载 xml,请改用 XDocument.Load

【讨论】:

    【解决方案2】:

    此代码将打印所有没有子节点的 xml 节点的内部文本:

        static void Main(string[] args)
        {
            XmlDocument x = new XmlDocument();
            x.Load("exp.xml");
            PrintNode(x.DocumentElement);
        }
    
        private static void PrintNode(XmlNode x)
        {
            if (!x.HasChildNodes)
                Console.Write(string.Format("{0} ", x.InnerText));
    
            for (int i = 0; i < x.ChildNodes.Count; i++)
            {
                PrintNode(x.ChildNodes[i]);
            }
        }
    

    在您的示例 XML 上,它将产生您想要的输出:)

    【讨论】:

      【解决方案3】:

      你可以试试这个:

              string input = @"
                  <root>
                      <slide>
                          <Image>hi</Image>
                          <ImageContent>this</ImageContent>
                          <Thumbnail>is</Thumbnail>
                          <ThumbnailContent>A</ThumbnailContent>
                      </slide>
                  </root>";
      
              XDocument doc = XDocument.Parse(input);
              //You can also load data from file by passing file path to Load method
              //XDocument doc = XDocument.Load("Data.xml");
              foreach(var slide in doc.Root.Elements("slide"))
              {
                  var words = slide.Elements().Select(el => el.Value);
                  string s = String.Join(" ", words.ToArray());
              }
      

      【讨论】:

      • 输入是“XML文件”,没有字符串
      • 在这种情况下,您应该使用文件路径作为 Load 方法的参数。
      • @AML,请注意doc.Root可以为空!请看我的回答:它有一些额外的检查。
      • @IvanG,words.ToArray() 调用不是必需的。 string.Join() 方法适用于 IEnumerable&lt;string&gt; 就好了。
      • @Serge 你试过string s = String.Join(" ", words); - 它抛出编译器错误说“Argument '2': cannot convert from 'System.Collections.Generic.IEnumerable' to 'string[]'”因为String.Join 需要string[],而不是IEnumerable&lt;string&gt;,所以它不会隐式转换为字符串数组。
      【解决方案4】:

      这会起作用

      static void Main(string[] args)
              {            
                  XDocument xmlSkuDescDoc = XDocument.Parse
                      (@"<root>
                                      <slide>
                                      <Image>hi</Image>
                                      <ImageContent>this</ImageContent>
                                      <Thumbnail>is</Thumbnail>
                                      <ThumbnailContent>A</ThumbnailContent>
                                      </slide>
                                      </root> "
                      ); 
                   var result = (from data in xmlSkuDescDoc.Descendants("slide")
                   select data).Elements().Select(i => i.Value).Aggregate((a, b) => a + " " + b); 
                  Console.ReadKey();
              }
      

      注意~如果从文件加载,请使用XDocument.Load(filename)

      例如

      string fileName = @"D:\MyXml.xml";
      XDocument xmlSkuDescDoc = XDocument.Load(filename);
      

      ....其余的如上图所示

      【讨论】:

        【解决方案5】:

        可以使用XDocument 类(LINQ to XML)来完成。假设您只有一个 slide 元素:

        使用纯XDocument导航:

        var doc = XDocument.Load("file path here");
        
        if (doc.Root == null)
            throw new ArgumentException(); // No root node!
        var slideElement = doc.Root.Element("slide");
        if (slideElement == null)
            throw new ArgumentException(); // No slide node!
        
        var values = string.Join(" ", slideElement.Elements().Select(element => element.Value));
        

        使用 XPath 节点选择:

        var doc = XDocument.Load("file path here");
        var slideElements = doc.XPathSelectElements("root/slide/*");
        var values = string.Join(" ", slideElements.Select(element => element.Value));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-22
          • 1970-01-01
          • 2020-06-12
          相关资源
          最近更新 更多