#c# #.net #xml #xpath #.net-2.0
#c# #.net #xml #xpath #.net-2.0
Вопрос:
У меня есть XML ниже:
<tcm:Component ID="tcm:481-636667" IsEditable="false" xmlns:tcm="http://www.tridion.com/ContentManager/5.0" xmlns:xlink="http://www.w3.org/1999/xlink">
<tcm:Context>
<tcm:Publication xlink:type="simple" xlink:title="07 Internal Test Publication" xlink:href="tcm:0-481-1"/>
<tcm:OrganizationalItem xlink:type="simple" xlink:title="System Resources" xlink:href="tcm:481-92640-2"/>
</tcm:Context>
<tcm:Data>
<tcm:Title>IBE - Skywards</tcm:Title>
<tcm:Type>Normal</tcm:Type>
<tcm:Schema xlink:type="simple" xlink:title="Resources" xlink:href="tcm:481-190471-8"/>
<tcm:Content>
<Resources xmlns="http://www.sdltridion.com/tridion/schemas">
<Text>
<Key>SKYRL_MBD</Key>
<Value>Miles Breakdown</Value>
</Text>
<Text>
<Key>ltSR_MB.Text</Key>
<Value>View Miles Breakdown</Value>
</Text>
<Text>
<Key>ltSR_HMB.Text</Key>
<Value>Hide Miles Breakdown</Value>
</Text>
<Text>
<Key>SKYRL_MBD_LK</Key>
<Value>Miles Breakdown</Value>
</Text>
</Resources>
</tcm:Content>
<tcm:Metadata>
<Metadata xmlns="http://www.sdltridion.com/tridion/schemas">
<Language>
<Language>English</Language>
</Language>
</Metadata>
</tcm:Metadata>
</tcm:Data>
</tcm:Component>
Теперь я хочу написать метод на C #, который примет этот XML в качестве входных данных и вернет все данные «Ключ» и «Значение» в списке.
Пожалуйста, предложите.
Ответ №1:
Сначала объявите списки для сохранения значений:
using System.Collections.Generic;
List<string> keysList = new List<string>();
List<string> valuesList = new List<string>();
Затем:
using System.Xml; // System.Xml.dll
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml); // Load(file)
var ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("tcm", "http://www.tridion.com/ContentManager/5.0");
ns.AddNamespace("xlink", "http://www.w3.org/1999/xlink");
foreach (XmlNode node in doc.SelectNodes("//*[local-name()="Key"]"))
{
keysList.Add(node.InnerText);
}
foreach (XmlNode node in doc.SelectNodes("//*[local-name()="Value"]"))
{
valuesList.Add(node.InnerText);
}
если вам не нужен XML DOM, используйте только XPath для оценки:
using System.Xml.XPath; // System.Xml.dll
XPathDocument doc = null;
using (TextReader reader = new StringReader(xml))
{
doc = new XPathDocument(reader); // specify just path to file if you have such one
}
XPathNavigator nav = doc.CreateNavigator();
foreach (XPathNavigator node in (XPathNodeIterator)nav.Evaluate("//*[local-name()="Key"]"))
{
keysList.Add(node.Value);
}
foreach (XPathNavigator node in (XPathNodeIterator)nav.Evaluate("//*[local-name()="Value"]"))
{
valuesList.Add(node.Value);
}
Комментарии:
1. Спасибо Aba !!, я использую .NET 2.0, приведенный выше код будет работать и в нем, а также после этого мне также нужно добавить все значения в список
2. Я думаю, что мы не можем использовать VAR в .NET 2.0, пожалуйста, предложите!
3. @Manu: Просто укажите тип с обеих сторон. Я обновил свой ответ.
4. Выдает ошибку в keysList.Add (узел. innerText); Выражение «Innertext» не определено, а также, не могли бы вы, пожалуйста, подсказать, какой тип значения будет «XML» в StringReader (xml)
5. Вместо этого следует использовать @Manu:
XPathNavigator.Value
.xml
является строкой. Если у вас есть путь к файлу, используйтеnew XPathDocument(path)
Ответ №2:
Используйте XElement или XDocument ( Linq2Xml)
XElement xml = XElement.Parse("inputxml");
var keys = xml.Descendants("Key");
OP говорит, что он использует .Net 2.0. Тогда это не сработает!
Ответ №3:
Взгляните на классы в System.Xml.Linq
пространстве имен. Если вы начнете с XDocument
, вы можете загрузить свой XML и просто запросить содержимое с помощью Linq.
Комментарии:
1. возможно, они используют .net 2.0, и в этом случае он не может использовать linq.