2013-07-02 3 views
0
<Report xmlns="Microsoft.SystemCenter.DataWarehouse.Report.Alert" xmlns:p1="w3.org/2001/XMLSchema-instance"; Name="Microsoft.SystemCenter.DataWarehouse.Report.Alert" p1:schemaLocation="Microsoft.SystemCenter.DataWarehou?Schema=True"> 
<Title>Alert Report</Title> 
<Created>6/27/2013 9:32 PM</Created> 
<StartDate>6/1/2013 9:29 PM</StartDate> 
<EndDate>6/27/2013 9:29 PM</EndDate> 
<TimeZone>(UTC)</TimeZone> 
<Severity>Warning, Critical</Severity> 
<Priority>Low, Medium, High</Priority> 
<AlertTable> 
    <Alerts> 
     <Alert> 
       <AlertName></AlertName> 
       <Priority></Priority> 
     </Alert> 
    </Alerts> 
</AlertTable> 
</Report> 

Так что я пытаюсь вывести список узлов, которые отображаются под дочерними элементами. So/Report/AlertTable/Alerts. Я делал очень похожего раньше, но в этом формате он почему-то не работает. Может ли кто-нибудь указать мне в правильном направлении?Выбор конкретного списка узлов в XML

XmlDocument Log = new XmlDocument(); 
     Log.Load("test.xml"); 
     XmlNodeList myLog = Log.DocumentElement.SelectNodes("//Report/AlertTable/Alerts"); 

     foreach (XmlNode alert in myLog) 
     { 
      Console.Write("HERE"); 
      Console.WriteLine(alert.SelectNodes("AlertName").ToString()); 
      Console.WriteLine(alert.SelectNodes("Priority").ToString()); 
      Console.Read(); 
     } 

EDIT: Один из ответов был я пытаюсь использовать кучу имен с p1, но не было такой удачи.

EDIT: Не сработал:

var name = new XmlNamespaceManager(log.NameTable); 
    name.AddNamespace("Report", "http://www.w3.org/2001/XMLSchema-instance"); 
    XmlNodeList xml = log.SelectNodes("//Report:Alerts", name); 
+1

Есть ли вероятность, что вы можете использовать LINQ to XML? Это все можно сделать с XmlDocument, но у вас будет лучшее время с LINQ to XML ... –

+1

try .SelectNodes («Report/AlertTable/Alerts»); – Jonesopolis

+0

@JonSkeet - Я не могу сказать, что я когда-либо использовал LINQ. Я сделал очень похожий скрипт на C# раньше, чем это, но я считаю, что пространство имен - это то, что его закручивает. – user99999991

ответ

0

Фигурные эту присоску из. Он имел отношение к пространству имен «Microsoft.SystemCenter.DataWarehouse.Report.Alert». Изменение этого на что угодно, но это не будет правильно читать XML.

 XmlDocument log = new XmlDocument(); 
     log.Load(@"C:\Users\barranca\Desktop\test.xml"); 
     // XmlNodeList xml = log.SelectNodes("//ns1:Alerts"); 

     var name = new XmlNamespaceManager(log.NameTable); 
     name.AddNamespace("ns1", "Microsoft.SystemCenter.DataWarehouse.Report.Alert"); 
     XmlNodeList xml = log.SelectNodes("//ns1:Alert", name); 



     foreach (XmlNode alert in xml) 
     { 
      Console.Write("HERE"); 
      XmlNode test = alert.SelectSingleNode("//ns1:AlertName",name); 
      string testing = test.InnerText; 
      Console.Write(testing); 
     } 
1

С сайтом:

nodename Selects all nodes with the name "nodename" 
/   Selects from the root node 
//   Selects nodes in the document from the current node that match the selection no matter where they are 

Так что я считаю,

"/AlertTable/Alerts" 

будет работать, так как это было бы «от корневой узел ', а также

"Report/AlertTable/Alerts" 

XPath Site

+0

Ни одна работа, когда я вхожу в отладчик и перешагиваю - myLog появляется как пустая. «Перечисление не дала никаких результатов» – user99999991

+0

И это странно, потому что даже // отказывается работать. На любом узле. Но я знаю, что Log.Load работает по отладчику – user99999991

+0

У вас есть пространство имен в xml, которое не показано выше? – Jonesopolis

Смежные вопросы