Читать значения из узлов XML?

1

Я пытаюсь извлечь информацию из строки XML, но я изо всех сил пытаюсь перебирать узлы.

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(OrderXml);
XmlNodeList parentNode = xmlDoc.GetElementsByTagName("SalesOrders");
XmlNodeList SalesOrderNode = xmlDoc.GetElementsByTagName("SalesOrder");
XmlNodeList parentNode2 = xmlDoc.GetElementsByTagName("WarningMessages");
foreach (XmlNode childrenNode in parentNode2)
{
  string test = childrenNode.Value.ToString();
}

Я хотел бы получить номер SalesOrder, в этом случае его r31283, после чего я хотел бы пропустить содержимое WarningMessages. Мне нужно захватить номер строки и код запаса для каждого предупреждения.

Мой XML:

<?xml version="1.0" encoding="Windows-1252"?>
<SalesOrders Language='05' Language2='EN' CssStyle='' DecFormat='1' DateFormat='01' Role='01' Version='6.1.085' OperatorPrimaryRole='100'>
<TransmissionHeader>
<TransmissionReference>00000000000003</TransmissionReference>
<SenderCode/> 
<DatePrepared>2014-05-22</DatePrepared>
<TimePrepared>09:12</TimePrepared>
</TransmissionHeader>
<Order>
<CustomerPoNumber>RQ140522-33</CustomerPoNumber>
<SalesOrder>r31283</SalesOrder>
<OrderActionType>A</OrderActionType>
<BackOrderComment>One or more lines have been placed on back order for order 'r31283'</BackOrderComment>
<WarningMessages>
<WarningDescription>Line 0001 for stock code 'NN0410BP01' was placed on back order</WarningDescription>
<WarningDescription>Line 0002 for stock code 'NN0400GR08' was placed on back order</WarningDescription>
<WarningDescription>Line 0003 for stock code 'NN0410BN01' was placed on back order</WarningDescription>
<WarningDescription>Line 0004 for stock code 'NN0370BH01' was placed on back order</WarningDescription>
<WarningDescription>Line 0005 for stock code 'NN0370BH02' was placed on back order</WarningDescription>
<WarningDescription>Line 0006 for stock code 'NN0390BC01' was placed on back order</WarningDescription>
<WarningDescription>Line 0007 for stock code 'NN0410HL01' was placed on back order</WarningDescription>
<WarningDescription>Line 0008 for stock code 'NN0410FD07' was placed on back order</WarningDescription>
<WarningDescription>Line 0009 for stock code 'NN0410FD08' was placed on back order</WarningDescription>
<WarningDescription>Line 0010 for stock code 'NN0400VL02' was placed on back order</WarningDescription>
</WarningMessages>
</Order>
</SalesOrders>
Теги:

4 ответа

4
Лучший ответ

Я рекомендую использовать Linq для Xml:

var xdoc = XDocument.Load(path_to_xml);
Regex regex = new Regex(@"Line (?<line>\d+) for stock code '(?<code>\w+)'");
var orders = from o in xdoc.Root.Elements("Order")
             select new
             {
                 SalesOrder = (string)o.Element("SalesOrder"),
                 WarningMessages =
                     from m in o.Element("WarningMessages").Elements()
                     let match = regex.Match((string)m)
                     where match.Success
                     select new
                     {
                         Line = match.Groups["line"].Value,
                         Code = match.Groups["code"].Value
                     }
             };

Вывод:

[
  {
     SalesOrder: "r31283",
     WarningMessages: [
       { Line: "0001", Code: "NN0410BP01" },
       { Line: "0002", Code: "NN0400GR08" },
       { Line: "0003", Code: "NN0410BN01" },
       { Line: "0004", Code: "NN0370BH01" },
       { Line: "0005", Code: "NN0370BH02" },
       { Line: "0006", Code: "NN0390BC01" },
       { Line: "0007", Code: "NN0410HL01" },
       { Line: "0008", Code: "NN0410FD07" },
       { Line: "0009", Code: "NN0410FD08" },
       { Line: "0010", Code: "NN0400VL02" }
    ]
  }
]
  • 0
    Березовский, как мне передать stringXML в этот XDocument.Load
  • 1
    @Pomster легко - используйте вместо него XDocument.Parse(stringXML)
1

Вы можете сделать это, используя LINQ to XML

// Load XML file.
var doc = XDocument.Load(path);

// Find SalesOrder element.
var salesOrder = (from c in doc.Descendants("SalesOrder")
                 select c.Value).FirstOrDefault();

// Find warning message elements.
var warningMessages = (from c in doc.Descendants("WarningDescription")
                      where c.Parent != null && c.Parent.Name == "WarningMessages"
                      select c.Value).ToList();

Затем цикл думал о предупреждающих сообщениях

foreach(var warningMessage in warningMessages)
{
    // Handle warning message...
}
0

сначала используйте класс XDocument, чтобы вы могли использовать LINQ to XML, а затем запросить этот документ. используйте метод Descendants для получения всех элементов в doc. затем выполните поиск тегов с именем тега SalesOrder, используя свойство Name. поскольку вы ожидаете, что только один согласованный элемент использует метод First() для результата, чтобы получить значение совпадающего тега.

    XDocument doc = XDocument.Load("some.xml");
    var result = from n in doc.Descendants() where n.Name == "SalesOrder" select n.Value;
    string val = result.First();
  • 0
    Пожалуйста, объясните ваш ответ вкратце. Это объяснение будет полезно ОП и другим читателям, которые читают ваш пост.
  • 0
    я отредактировал свой комментарий с объяснением.
0

Попробуйте вот так:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(OrderXml);
XmlNode parentNode = xmlDoc.SelectSingleNode("SalesOrders");
XmlNode SalesOrderNode = xmlDoc.SelectSingleNode("SalesOrder");
XmlNodeList lstWarning = xmlDoc.SelectNodes("WarningMessages/WarningDescription");
foreach (XmlNode childrenNode in lstWarning)
{ 
    string test = childrenNode.InnerText;
}

А также прочитал кое-что о XPath.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню