如何从XmlDocument中获取缩进的InnerText?

时间:2014-09-26 14:51:14

标签: c# .net xml-parsing xmldocument

是否有方法从C#中的XmlDocument中获取缩进文本?我的意思是,如果有一个内置方法。 (如果没有更简单的解决方案,我正在考虑以递归方式解析XML节点并提取每个节点的内部文本,同时将递归级别保持为缩进(使用自定义字符))。

e.g。

<Element>
  <Children>
    <Element>
      <Messages>
        <Message type="0">
          <Text>[MutationEngine:CraSyncMutationEngine]</Text>
        </Message>
      </Messages>
      <Children>
        <Element>
          <Messages>
            <Message type="0">
              <Text>[Stage:'StageLoad']</Text>
            </Message>
            <Message type="0">
              <Text>[Stage:'StageMergeWithPi']</Text>
            </Message>
            <Message type="0">
              <Text>[Stage:'StageSaveRelationImage']</Text>
            </Message>
          </Messages>
          <Children>
            <Element>
              <Messages>
                <Message type="0">
                  <Text>[PreValidate]</Text>
                </Message>
              </Messages>
            </Element>
            <Element>
              <Messages>
                <Message type="0">
                  <Text>[Action:'LoadPersistedInput']</Text>
                </Message>
              </Messages>
            </Element>
          </Children>
        </Element>
      </Children>
    </Element>
  </Children>
</Element>

应该成为:

-----[MutationEngine:CraSyncMutationEngine]
-------[Stage:'StageLoad']
-------[Stage:'StageMergeWithPi']
-------[Stage:'StageSaveRelationImage']
---------[PreValidate]
---------[Action:'LoadPersistedInput']

假设我们使用-字符进行缩进。 C#代码:

var xmlDoc = new XmlDocument { PreserveWhitespace = true };
xmlDoc.LoadXml(log);

var logInnerText = xmlDoc.InnerText;

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

这是一种可能的方式:

var doc = new XmlDocument();
.....
//select all elements having non empty inner text
var nodesHavingInnerText = doc.DocumentElement
                              .SelectNodes("//*[normalize-space(text())]");
var result = "";
foreach (XmlNode node in nodesHavingInnerText)
{
            //put "-" repeated as many as current node's level in the XML doc
    result += string.Concat(Enumerable.Repeat("-", GetLevel(node))) 
                    + 
              node.InnerText 
                    + 
              Environment.NewLine;
}

GetLevel()函数定义如下(改编自@ Slak&#39;对另一个问题的回答:Return node level of hierarchical xml):

public int GetLevel(XmlNode node)
{
    if (node.ParentNode == null) return 0;
    return 1 + GetLevel(node.ParentNode);
}

<强> [.NET fiddle demo]

答案 1 :(得分:0)

我并不完全清楚你打算做什么,但我希望这会有所帮助

string result=xmlDoc.Element("Element")
                    .Element("Children")
                    .Element("Element")
                    .Element("Messages")
                    .Element(Message)
                    .Element("Text").Value;

如果您想让节点的所有孩子都使用Elements而不是Element,那么您将获得XElement类型的列表。