简体   繁体   English

如何从XmlDocument缩进InnerText?

[英]How to get indented InnerText from an XmlDocument?

Is there a method to get indented text from an XmlDocument in C#? 有没有一种方法可以从C#中的XmlDocument获取缩进的文本? I mean, if there is a build-in method for this. 我的意思是,如果有内置方法。 (If there's not a more simpler solution, I'm thinking at one to recursively parse the XML nodes and extract the inner text of each node, while keeping the level of recursiveness as an indentation (with custom character)). (如果没有更简单的解决方案,我正在考虑递归解析XML节点并提取每个节点的内部文本,同时保持递归级别作为缩进(具有自定义字符))。

eg 例如

<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>

should become: 应该变成:

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

assuming that we are using the - character for indentation. 假设我们使用-字符进行缩进。 The C# code: C#代码:

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

var logInnerText = xmlDoc.InnerText;

Any help is greatly appreciated! 任何帮助是极大的赞赏!

This is one possible way : 这是一种可能的方式:

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() function is defined as follow (adapted from @Slak's answer to another question : Return node level of hierarchical xml ) : GetLevel()函数的定义如下(根据GetLevel()对另一个问题的回答: 返回分层xml的节点级别 ):

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

[ .NET fiddle demo ] [ .NET小提琴演示 ]

I don't undersand exactly what you intend to do, but I hope this will help 我不会完全理解您的打算,但是我希望这会有所帮助

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

If you want to get all children of a node use Elements instead of Element and you will get a list of XElement type. 如果要获取节点的所有子节点,请使用Elements而不是Element ,您将获得XElement类型的列表。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM