我正在深入研究XmlDocument构建的世界,并认为我会尝试重新构建(至少部分)由Microsoft的程序UISpy提供的桌面树。
到目前为止,我能够抓住桌面的一个孩子并将其写入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文件...
现在,当我添加一行来更改每个XML元素的InnerText属性时,如temp.InnerText = lct
我得到一个奇怪的格式化XML文件。
我对此的期望是每个InnerText与XML元素的开始和结束标记位于同一行,但是除了最后一个元素的InnerText之外的所有内容都位于新行上。
所以我的问题是,为什么呢?我可以用我的XML元素做些什么来让他们的InnerText出现在同一行吗?
答案 0 :(得分: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将它们显示为"等于" - 两者都嵌套在其父元素下并且处于相同的缩进级别。