Чтение внутреннего текста одного элемента из большого файла xml - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть большой единственный узел. xml файл, который я сохранил как строку. Я хочу проанализировать файл. xml для чтения указанного элемента c и вывода внутреннего текста. Например: я хочу прочитать элемент FrameNo и вывести BIN GO в окно сообщения. Нужный элемент появится в документе. xml только один раз. Я предпочитаю использовать XmlDocument.

Я пробовал множество C#. xml примеров, но не могу получить вывод.

xml текст

    <Aircraft z:Id="i1" xmlns="http://xxx.yyyyycontract.gov/2018/03/Boeing.xxxxxxxxxxxxxx.Airframe" 
    xmlns:i="http://www.xxxxxxx.com/2019/XMLSchema-instance" 
    xmlns:z="http://xxxxxxx.xxxxxxxxx.com/2005/01/Serialization/"><Timestamp i:nil="true"/> 
    <Uuid>00000000-0000-0000-0000-000000000000</Uuid><Comments i:nil="true"/><Facility>..........

и так далее до конца. xml

    <FrameNo>BINGO</FrameNo><WDate i:nil="true"/></Aircraft>

это раздел кода, в котором я хочу выполнить код.

    private void buttonLoad_Click(object sender, EventArgs e)
    {
    }

Ответы [ 4 ]

0 голосов
/ 21 апреля 2020

Появилась еще одна странная загвоздка. Некоторые из элементов названы так:

    <a:SupplierServDoc>

содержимое внутреннего текста этого элемента представляет собой пакет base64. Нет проблем при обработке пакета base64.

Код из приведенных выше ответов действительно выводит base64 правильно, но не может обработать: в имени элемента. Он выдает ошибку с шестнадцатеричным символом 3А.

У меня есть этот код, который выводит inttertext, но не как пакет base64. Я также изучил префикс для обработки: но с худшими результатами. По завершении я вывожу внутренний текст base 64 в виде файла .txt.

    XNamespace ad = http://www.mmmmmmmmmm.com";
    XName k = ad + "SupplierServDoc";
    string[] WING = doc.Descendants(k).Select(x => (string)x).ToArray();
    string wing = string.Join("", WING);
    if (string.IsNullOrEmpty(syncd))
    {
    MessageBox.Show("a:SupplierServDoc Base 64 code not found");
    }
    else
    {           
    MessageBox.Show("Test " + wing);
    }
0 голосов
/ 18 апреля 2020

Вам необходимо использовать пространство имен по умолчанию. Смотрите мое xml решение linq ниже:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            string xml = File.ReadAllText(FILENAME);
            XDocument doc = XDocument.Parse(xml);
            XNamespace ns = doc.Root.GetDefaultNamespace();

            XElement frameNo = doc.Descendants(ns + "FrameNo").FirstOrDefault();

            string frame = (string)frameNo;
            string[] serialNumbers = doc.Descendants(ns + "SerialNumber").Select(x => (string)x).ToArray(); 

        }
    }
}
0 голосов
/ 19 апреля 2020

Благодаря jdweng я хотел поделиться финальным кодом для использования другими. Это будет работать следующим способом:

    private void buttonMaint_Click(object sender, EventArgs e)
    {
    XDocument doc = XDocument.Parse(xmlinputstr); // input string from memory or input file
    XNamespace ns = doc.Root.GetDefaultNamespace();
                string[] Frame = doc.Descendants(ns + "FrameNo").Select(x => (string)x).ToArray(); // selects element to read + trailing character of >
    string frame = string.Join("", Frame); //converts from array to string
    if (string.IsNullOrEmpty(frame)) // check for empty result
    {
    txtFrame.Text = "not found"; //outputs to textbox
    }
    else
    {
    txtFrame.Text = (frame); //outputs to textbox
    }
    }

Комментарии для ясности

0 голосов
/ 18 апреля 2020

Я думаю, это говорит само за себя

using System.Xml.Linq;

XElement root = XElement.Load(textXML);
XElement myElement = root.Element("FrameNo");
if (myElement != null)
    myData = myElement.InnerText;
...