如何从XML文件中获取所有文本节点

时间:2022-10-31 11:52:56

I want to get all text nodes from an XML file.

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

How can I do this?

我怎样才能做到这一点?

Example Input:

示例输入:

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

Expected Output:

预期产出:

hi this is A

5 个解决方案

#1


2  

You can try this:

你可以试试这个:

        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());
        }

#2


10  

The only solution (so far) to enumerate all text nodes in any xml, regardless of its structure:

唯一的解决方案(到目前为止)枚举任何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);
}

EDIT: if you want to load xml from file then use XDocument.Load instead.

编辑:如果你想从文件加载xml然后使用XDocument.Load。

#3


3  

This code will print the inner text of all xml nodes which doesnt have a child:

此代码将打印没有子项的所有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]);
        }
    }

On your example XML it will result in the output you want :)

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

#4


2  

This will work

这会奏效

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();
        }

N.B.~ use XDocument.Load(filename) if loading from file

N.B.~如果从文件加载,则使用XDocument.Load(filename)

e.g.

例如

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

.... and the rest follows as shown above

....其余如下所示

#5


1  

It can be done using XDocument class (LINQ to XML). Assuming that you have exactly one slide element:

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

Using plain XDocument navigation:

使用普通的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));

Using XPath node selection:

使用XPath节点选择:

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

#1


2  

You can try this:

你可以试试这个:

        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());
        }

#2


10  

The only solution (so far) to enumerate all text nodes in any xml, regardless of its structure:

唯一的解决方案(到目前为止)枚举任何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);
}

EDIT: if you want to load xml from file then use XDocument.Load instead.

编辑:如果你想从文件加载xml然后使用XDocument.Load。

#3


3  

This code will print the inner text of all xml nodes which doesnt have a child:

此代码将打印没有子项的所有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]);
        }
    }

On your example XML it will result in the output you want :)

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

#4


2  

This will work

这会奏效

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();
        }

N.B.~ use XDocument.Load(filename) if loading from file

N.B.~如果从文件加载,则使用XDocument.Load(filename)

e.g.

例如

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

.... and the rest follows as shown above

....其余如下所示

#5


1  

It can be done using XDocument class (LINQ to XML). Assuming that you have exactly one slide element:

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

Using plain XDocument navigation:

使用普通的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));

Using XPath node selection:

使用XPath节点选择:

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