Извлечение элемента из XML в строку C #

#c# #xml #string #linq

#c# #xml #строка #linq

Вопрос:

Мне нужно просмотреть XML-документ, встроенный в мой проект VS (с использованием 2013), и извлечь определенные элементы для использования в качестве строк в моем приложении. Я пытался использовать XmlReader, XmlDocument и LINQ, и по какой-то причине я не могу понять, как извлекать элементы в свой код. До сих пор я не нашел MSDN очень полезным, и я искал это в течение нескольких часов. Я никогда не создавал приложение на C #, которое использует внешний файл, я мог бы действительно использовать некоторые рекомендации о том, как подойти к этому? Вот последнее, что я пробовал:

         XmlDocument doc = new XmlDocument();
        doc.Load(@"XML FILEPATH");

        // Create an XmlNamespace Manager to resolve the default namespace
        XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
        nsmgr.AddNamespace("cfg","urn:config-schema");

        XmlNode writeDir;
        XmlElement root = doc.DocumentElement;
        writeDir = root.SelectSingleNode("descendant::cfg:write_directory",nsmgr);

        Console.WriteLine(writeDir.OuterXml);
        Console.ReadLine();
  

Мой XML выглядит следующим образом:

         <?xml version="1.0" encoding="utf-8" ?>
          <settings smlns="urn:config-schema">
            <write_directory>"WRITEDIRECTORYLOCATION"</write_directory>
            <read_directory>"READDIRECTORYLOCATION"</read_directory>
          </settings>
  

У меня не было большого опыта работы с XML, поэтому простите меня, если это неаккуратно. Спасибо всем!

Комментарии:

1. это smlns опечатка? потому что, как написано , это не объявляет пространство имен xml

Ответ №1:

Во-первых, как отметил Марк в комментарии, ваше namespacedeclaration неверно: smlns должно быть xmlns .

Во-вторых, у меня есть для вас два примера того, как вы могли бы извлечь данные. В первом примере проверяется, существуют ли элементы, а затем извлекается их значение. Вы можете использовать этот пример, если вы не уверены, существуют ли элементы в вашем файле:

 XDocument doc = XDocument.Load(@"D:Tempfile.xml");
if (doc.Root != null)
{
    XElement writeDirectoryElement = doc.Root.Elements().FirstOrDefault(e => e.Name.LocalName == "write_directory");
    XElement readDirectoryElement = doc.Root.Elements().FirstOrDefault(e => e.Name.LocalName == "read_directory");
    string writeDirectory = writeDirectoryElement != null ? writeDirectoryElement.Value : "";
    string readDirectory = readDirectoryElement != null ? readDirectoryElement.Value : "";
}
  

Мой второй пример следует использовать, если вы знаете, что оба значения существуют:

 XDocument doc = XDocument.Load(@"D:Tempfile.xml");
string write_directory = doc.Root.Elements().FirstOrDefault(e => e.Name.LocalName == "write_directory").Value;
string read_directory = doc.Root.Elements().FirstOrDefault(e => e.Name.LocalName == "read_directory").Value;
  

Ответ №2:

Пожалуйста, предоставьте больше информации о вашей проблеме. Что не так с вашим кодом прямо сейчас?

Пожалуйста, рассмотрите приведенный ниже код. Он полностью работает и распечатывает: «WRITEDIRECTORYLOCATION»

         var doc = new XmlDocument();
        doc.LoadXml("<?xml version="1.0" encoding="utf-8" ?><settings xmlns="urn:config-schema"><write_directory>"WRITEDIRECTORYLOCATION"</write_directory><read_directory>"READDIRECTORYLOCATION"</read_directory></settings>");

        // Create an XmlNamespace Manager to resolve the default namespace
        XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
        nsmgr.AddNamespace("cfg", "urn:config-schema");

        XmlNode writeDir;
        XmlElement root = doc.DocumentElement;
        writeDir = root.SelectSingleNode("descendant::cfg:write_directory", nsmgr);

        Console.WriteLine(writeDir.InnerText);
        Console.ReadLine();