【问题标题】:How to get InnerText and InnerXml of a Node from XmlDocument?如何从 XmlDocument 中获取节点的 InnerText 和 InnerXml?
【发布时间】:2017-02-04 07:06:06
【问题描述】:

例如,我有这个 xml 字符串:

<?xml version="1.0" encoding="utf-8"?>
<data>
   <text>How to get <bold>all</bold> this string's content?</text>
</data>

我想在对象数组中获取所有这些元素(对于每个对象我都有一个类),而不会丢失它们的结构:

[1] (TextClass; where bold = false) How to get 
[2] (TextClass; where bold = true) all
[3] (TextClass; where bold = false) this string's content?

我现在使用XmlDocumentXmlNode 类分别是InnerText 或InnerXml。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("example.xml");
foreach (XmlNode child in xmlDoc.DocumentElement.ChildNodes)
{
   string chName = child.Name; // text
   string text = child.InnerText; // How to get all this string's content?
   string xml = child.InnerXml; // How to get <bold>all</bold>this string's content?
}

有可能吗?

【问题讨论】:

  • 你到底在问什么?你有孩子。你缺少什么?遍历ChildNodes 并相应地创建您自己的类实例。将它们添加到 List&lt;T&gt; 或其他。或者使用 LINQ。
  • @EdPlunkett 我想要得到的是文本序列,其中我可能有一个 XmlNode,它表明这个文本是风格化的。通过迭代 throw 子节点,我将丢失这个序列,因为我将分别获得文本和风格化文本。
  • 什么文本序列?你的那个有什么问题?你能给我看一个在ChildNodes 中出现乱序的子节点序列的例子吗? “彼此分开”是什么意思?
  • 哦,等一下,您正在查看文档根目录的子项。您需要“数据”节点的子节点。将该代码放入递归函数中。如果child.ChildNodes.Count &gt; 0,则递归。
  • 或者只是 xmlDoc.SelectSingleNode("//data") 并遍历他的孩子。

标签: c# xml xml-parsing xmldocument xmlnode


【解决方案1】:

对于这种工作,我认为使用LINQ to XML 更容易。

在您的示例中,可以使用以下内容(具体取决于您想要实现的目标):

XDocument doc = XDocument.Parse(xml);
var textClasses = from n in doc.Descendants("text").DescendantNodes()
                  where n.NodeType == XmlNodeType.Text
                  select new { text = ((XText)n).Value, bold = n.Parent?.Name == "bold" };

还有一个.net fiddle,以便您快速查看结果。

【讨论】:

    猜你喜欢
    • 2011-01-16
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2023-03-19
    • 2021-09-25
    相关资源
    最近更新 更多