簡體   English   中英

如何從XmlDocument縮進InnerText?

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

有沒有一種方法可以從C#中的XmlDocument獲取縮進的文本? 我的意思是,如果有內置方法。 (如果沒有更簡單的解決方案,我正在考慮遞歸解析XML節點並提取每個節點的內部文本,同時保持遞歸級別作為縮進(具有自定義字符))。

例如

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

任何幫助是極大的贊賞!

這是一種可能的方式:

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()函數的定義如下(根據GetLevel()對另一個問題的回答: 返回分層xml的節點級別 ):

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

[ .NET小提琴演示 ]

我不會完全理解您的打算,但是我希望這會有所幫助

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

如果要獲取節點的所有子節點,請使用Elements而不是Element ,您將獲得XElement類型的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM