2017-02-22 34 views
0

Я вникаю в мир XmlDocument и думал, что попытаюсь перестроить (по крайней мере, частично) дерево Desktop, данное программой Microsoft UISpy.XmlElement Свойство InnerText

До сих пор я мог захватить дочерний элемент рабочего стола и записать его в документ XML, а затем захватить каждый его дочерний элемент и записать его в документ XML.

Пока код выглядит следующим образом ...

using System.Windows.Automation; 
using System.Xml; 

namespace MyTestApplication 
{ 
    internal class TestXmlStuff 
    { 
     public static void Main(string[] args) 
     { 
      XmlDocument xDocument = new XmlDocument(); 
      AutomationElement rootElement = AutomationElement.RootElement; 
      TreeWalker treeWalker = TreeWalker.ContentViewWalker; 

      XmlNode rootXmlElement = xDocument.AppendChild(xDocument.CreateElement("Desktop")); 
      AutomationElement autoElement = rootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "GitHub")); 
      string name = autoElement.Current.Name; 

      while (autoElement != null) 
      { 
       string lct = autoElement.Current.LocalizedControlType.Replace(" ", ""); 
       lct = (lct.Equals("") ? "Cusotm" : lct); 
       XmlElement temp = (XmlElement)rootXmlElement.AppendChild(xDocument.CreateElement(lct)); 
       //temp.InnerText = lct; 
       string outerXML = temp.OuterXml; 
       rootXmlElement = temp; 
       autoElement = treeWalker.GetNextSibling(autoElement); 
      } 
     } 
    } 
} 

... и полученный файл XML ...

Test XML File

Теперь, когда я добавить строку, чтобы изменить свойство InnerText каждого элемента XML, например temp.InnerText = lct Я получаю странно сформированный XML-файл.

enter image description here

То, что я ожидал от этого было то, что каждый InnerText будет на той же линии, что и открывающим и закрывающим тегами элемента XML, но вместо этого все, кроме InnerText последний элемент находится на новой линии.

Так что мой вопрос: почему это так? Есть ли что-то еще, что я мог бы делать с моими XML-элементами, чтобы их InnerText отображался в одной строке?

+1

XML - это формат данных, а не один. Как IE предпочитает отображать XML-документ (в отсутствие таблицы стилей), полностью зависит от него, и, по-видимому, именно так он выбирает отображение XML-элементов со смешанным контентом. –

+0

Если вы хотите увидеть, как выглядит истинный XML, откройте его в Notepad или Notepad ++ (или в каком-то подобном текстовом редакторе, даже в Visual Studio). Как сказал Damien_The_Unbeliever ... IE отображает XML так, как он хочет. Не так, как вы всегда ожидаете. –

ответ

1

Как я уже сказал в комментарии, XML не является форматом отображения, поэтому он форматируется, однако IE решает это сделать.

Чтобы приблизиться к тому, что вы ожидали, вы можете рассмотреть возможность использования атрибута, а не InnerText:

XmlElement temp = (XmlElement)rootXmlElement.AppendChild(xDocument.CreateElement(lct)); 
var attr = xDocument.CreateAttribute("type"); 
attr.Value = lct; 
temp.Attributes.Append(attr); 

IE отображает атрибуты в открытии элемента, который может быть достаточно для ваших целей.


С точки зрения XML, что вы в настоящее время создание называется смешанным содержимым - у вас есть элемент, который содержит текст и другие элементы. С иерархической точки зрения эти текстовые узлы и другие элементы занимают одно и то же место в иерархии, поэтому я бы предположил, что именно поэтому IE отображает их как «равные» - как вложенные под их родительским элементом, так и на том же уровне отступов.