Вы можете найти объяснение в строке 8416 в вашем связанном модуле angularjs. Они просто console.error в операторе catch. Вы можете изменить это поведение, например пустым обработчиком:
angular.module('exceptionOverride', []).factory('$exceptionHandler', () => (exception, cause) });
var app = angular.module("httptest", ['exceptionOverride']);
....
Что ж, с XDocument
и LINQ-to-XML:
foreach(var name in doc.Root.DescendantNodes().OfType<XElement>()
.Select(x => x.Name).Distinct())
{
Console.WriteLine(name);
}
Однако существует множество похожих маршрутов.
Использование XPath
XmlDocument xdoc = new XmlDocument();
xdoc.Load(something);
XmlNodeList list = xdoc.SelectNodes("//BookStore");
дает вам список со всеми узлами в документе с именем BookStore
Пурист пуристов сделать это (и, честно говоря, правильно) означало бы иметь определение контракта схемы и читать его таким образом. При этом вы можете сделать что-то вроде этого ...
List<string> nodeNames = new List<string>();
foreach(System.Xml.XmlNode node in doc.SelectNodes("BookStore/Book"))
{
foreach(System.Xml.XmlNode child in node.Children)
{
if(!nodeNames.Contains(child.Name)) nodeNames.Add(child.Name);
}
}
Это, по общему признанию, рудиментарный метод получения списка различных имен узлов для дочерних узлов Book
, но вы не указали многое другое в вашей среде (например, если у вас 3.5, вы можете использовать LINQ to XML, чтобы сделать это немного красивее),
Если вы используете C # 3.0, вы можете сделать следующее :
var data = XElement.Load("c:/test.xml"); // change this to reflect location of your xml file
var allElementNames =
(from e in in data.Descendants()
select e.Name).Distinct();
Вы можете попробовать сделать это с помощью XPATH .
XmlDocument doc = new XmlDocument();
doc.LoadXml("xml string");
XmlNodeList list = doc.SelectNodes("//BookStore/Book");
Я согласен с Адамом, идеальным условием является наличие схемы, определяющей содержимое XML-документа. Однако иногда это невозможно. Вот простой способ перебора всех узлов XML-документа и использования словаря для хранения уникальных локальных имен. Мне нравится отслеживать глубину каждого локального имени, поэтому я использую список int для хранения глубины. Обратите внимание, что XmlReader «экономит память», поскольку он не загружает весь документ, как XmlDocument. В некоторых случаях это не имеет большого значения, потому что размер XML-данных невелик. В следующем примере файл размером 18,5 МБ читается с помощью XmlReader. Использование XmlDocument для загрузки этих данных было бы менее эффективным, чем использование XmlReader для чтения и выборки его содержимого.
string documentPath = @"C:\Docs\cim_schema_2.18.1-Final-XMLAll\all_classes.xml";
Dictionary<string, List<int>> nodeTable = new Dictionary<string, List<int>>();
using (XmlReader reader = XmlReader.Create(documentPath))
{
while (!reader.EOF)
{
if (reader.NodeType == XmlNodeType.Element)
{
if (!nodeTable.ContainsKey(reader.LocalName))
{
nodeTable.Add(reader.LocalName, new List<int>(new int[] { reader.Depth }));
}
else if (!nodeTable[reader.LocalName].Contains(reader.Depth))
{
nodeTable[reader.LocalName].Add(reader.Depth);
}
}
reader.Read();
}
}
Console.WriteLine("The node table has {0} items.",nodeTable.Count);
foreach (KeyValuePair<string, List<int>> kv in nodeTable)
{
Console.WriteLine("{0} [{1}]",kv.Key, kv.Value.Count);
for (int i = 0; i < kv.Value.Count; i++)
{
if (i < kv.Value.Count-1)
{
Console.Write("{0}, ", kv.Value[i]);
}
else
{
Console.WriteLine(kv.Value[i]);
}
}
}