antaresinsomnious Ответов: 4

Как читать XML-файл без каких-либо общих тегов, кроме атрибутов? (Пример в задаче)


Я искал решение в течение последних 4 часов и нашел несколько частей, которые помогают мне читать стандартизированный xml-файл, но не позволяют мне читать это.

Я также пытаюсь сохранить родительский узел, где "key=" (not null)"", так что это не может быть Key="".

Я пытаюсь вытащить из этого то, что равно ключу, и родительский элемент.
Я был бы очень признателен за любую помощь, потому что это было очень утомительно.
Заранее спасибо.

<setspeed100>
	<primary device="Keyboard" key="Key_Numpad_4">
	<secondary device="{NoDevice}" key="">

<yawaxis_landing>
	<binding device="{NoDevice}" key="">
	<inverted value="0">
	<deadzone value="0.00000000">


Что я уже пробовал:

<pre lang="C#"> XmlDocument xmlDoc = new XmlDocument();
    var edXML = GetEDBindingsPath();
    var xml = XElement.Load(edXML);


That is as far as I've gotten because everything else uses a standardized format. 
Example of what I mean by standardized...


< Users >
  < User >
    < Name > John Smith </ Name >
    < test >
      < Date > 23.05.2011 </ Date >
      < points > 33 </ points >
    </ test >
    < test >
      < Date > 22.06.2011 </ Date >
      < points > 29 </ points >
    </ test >
  </ User >
</ Users >

johannesnestler

Итак, под XML мы подразумеваем хорошо сформированный XML-документ - много кода доступно для решения этой проблемы - у вас здесь нет XML, поэтому вам нужно написать свой собственный парсер - почему вы решили, что это хорошая идея рассматривать это как XML в первую очередь (потому что это выглядит как XML издалека?

antaresinsomnious

Каждый XML-контролер, через который я его прогонял, говорил, что это так, но я не знаком с XML. Я решил, что это так, потому что он от разработчика игр. Я полагал, что, поскольку они ставили сверху, они знали, что пишут.
Хотя я почти понял это(с помощью моего собственного парсера), я просто не знаю, почему он пропускает определенные вещи...

4 Ответов

Рейтинг:
12

antaresinsomnious

То, как я заставил его работать.

internal void ReadEDKeyBindings()
        {
            string edKB = GetEDBindingsPath();
            List<string> list = new List<string>();
            List<string> parent = new List<string>();
            List<string> child = new List<string>();
            XDocument doc = XDocument.Load(edKB);
            var allElements = doc.Descendants();

            //var matchingElements = doc.Descendants()
            //    .Where(x => x.Attribute("Key") != null);


            foreach (var a in allElements)
            {
                string str = a.ToString();
                string[] pPart = str.Split(new[] { '\r' });
                foreach (string p in pPart)
                {
                    list.Add(p);
                }
            }

            foreach (string l in list)
            {
                if (!l.Contains("Buggy"))
                {
                    if (l.Contains("Key") && (!l.Contains("Modifier") && (!l.Contains("Secondary") && (!l.Contains("Joy")))))
                    {
                        try
                        {
                            string[] parts = l.Split(new[] { ' ' });
                            string sub = parts[6].Substring(5);
                            int last = sub.Length - 1;
                            sub = sub.Substring(0, last);
                            if (sub != "")
                            {
                                int index = list.IndexOf(l);

                                string tmp1 = list[index - 1];

                                string tmp2 = tmp1.Substring(4);
                                int iTmp = tmp2.Length - 1;
                                string p = tmp2.Substring(0, iTmp);
                                parent.Add(p);
                                child.Add(sub);
                            }
                        }
                        catch
                        {

                        }
                    }
                }
            }
            //for (int i = 0; i < parent.Count(); i++)
            //{
            //    Console.WriteLine("Index = " + i + " :  Parent : " + parent[i] + " : Child : " + child[i]);
            //    //Console.ReadKey();
            //}
            //Console.ReadKey();
        }


Рейтинг:
1

Richard MacCutchan

Вы могли бы попробовать Класс XmlReader (System.Xml)[^], но это не похоже на хорошо сформированный XML, так что у вас все еще могут быть проблемы.


antaresinsomnious

Я использую класс XmlReader.
Он совершенно не очень хорошо сформирован. Он был выпущен Frontier Development для Elite Dangerous (это их ключевые привязки). Я боюсь, что мне придется жестко кодировать все, и я действительно не хочу этого делать, потому что в конце концов это просто усложняет все остальное, так как мне придется менять свой xml-файл, который я использую, каждый раз, когда я меняю привязки ключей.
Но я не сдаюсь.

Richard MacCutchan

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

Рейтинг:
1

antaresinsomnious

Вот ссылка на мой " XML"

& lt;script src='http://pastie.org/10946087.js'>
< / script>


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

internal void ReadEDKeyBindings()
        {
            string edKB = GetEDBindingsPath();
            List<string> list = new List<string>();
            List<string> parent = new List<string>();
            List<string> child = new List<string>();
            XDocument doc = XDocument.Load(edKB);
            var allElements = doc.Descendants();

            var matchingElements = doc.Descendants()
                .Where(x => x.Attribute("Key") != null);


            foreach (var a in allElements)
            {
                string str = a.ToString();
                string[] pPart = str.Split(new[] { '\r' });
                foreach (string p in pPart)
                {
                    list.Add(p);
                }
            }
            foreach (string l in list)
            {
                if (!l.Contains("Buggy"))
                {
                    if (l.Contains("Key"))
                    {
                        try
                        {
                            string[] parts = l.Split(new[] { ' ' });
                            string sub = parts[6].Substring(5);
                            int last = sub.Length - 1;
                            sub = sub.Substring(0, last);
                            if (sub != "")
                            {
                                int index = list.IndexOf(l);

                                string tmp1 = list[index - 1];

                                string tmp2 = tmp1.Substring(4);
                                int iTmp = tmp2.Length - 1;
                                string p = tmp2.Substring(0, iTmp);
                                parent.Add(p);
                                child.Add(sub);
                            }
                        }
                        catch
                        {

                        }
                    }
                }
            }
            for (int i = 0; i < parent.Count(); i++)
            {
                Console.WriteLine("Index = " + i + " :  Parent : " + parent[i] + " : Child : " + child[i]);
            }
        }


Рейтинг:
0

antaresinsomnious

Это полный "XML". Ссылка, которую я разместил, по какой-то причине сломалась.

<?xml version="1.0" encoding="UTF-8" ?>
<Root PresetName="Custom" MajorVersion="1" MinorVersion="8">
	<KeyboardLayout>en-US</KeyboardLayout>
	<LockedDevice>{NoDevice}</LockedDevice>
	<MouseXMode Value="Bindings_MouseRoll" />
	<MouseXDecay Value="0" />
	<MouseYMode Value="Bindings_MousePitch" />
	<MouseYDecay Value="0" />
	<MouseReset>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</MouseReset>
	<MouseSensitivity Value="1.00000000" />
	<MouseDecayRate Value="4.00000000" />
	<MouseDeadzone Value="0.05000000" />
	<MouseLinearity Value="1.00000000" />
	<MouseGUI Value="1" />
	<YawAxisRaw>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</YawAxisRaw>
	<YawLeftButton>
		<Primary Device="Keyboard" Key="Key_A" />
		<Secondary Device="{NoDevice}" Key="" />
	</YawLeftButton>
	<YawRightButton>
		<Primary Device="Keyboard" Key="Key_D" />
		<Secondary Device="{NoDevice}" Key="" />
	</YawRightButton>
	<YawToRollMode Value="Bindings_YawIntoRollNone" />
	<YawToRollSensitivity Value="0.40000001" />
	<YawToRollButton>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
		<ToggleOn Value="0" />
	</YawToRollButton>
	<RollAxisRaw>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</RollAxisRaw>
	<RollLeftButton>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</RollLeftButton>
	<RollRightButton>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</RollRightButton>
	<PitchAxisRaw>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</PitchAxisRaw>
	<PitchUpButton>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</PitchUpButton>
	<PitchDownButton>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</PitchDownButton>
	<LateralThrustRaw>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</LateralThrustRaw>
	<LeftThrustButton>
		<Primary Device="Keyboard" Key="Key_Q" />
		<Secondary Device="{NoDevice}" Key="" />
	</LeftThrustButton>
	<RightThrustButton>
		<Primary Device="Keyboard" Key="Key_E" />
		<Secondary Device="{NoDevice}" Key="" />
	</RightThrustButton>
	<VerticalThrustRaw>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</VerticalThrustRaw>
	<UpThrustButton>
		<Primary Device="Keyboard" Key="Key_R" />
		<Secondary Device="{NoDevice}" Key="" />
	</UpThrustButton>
	<DownThrustButton>
		<Primary Device="Keyboard" Key="Key_F" />
		<Secondary Device="{NoDevice}" Key="" />
	</DownThrustButton>
	<AheadThrust>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</AheadThrust>
	<ForwardThrustButton>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</ForwardThrustButton>
	<BackwardThrustButton>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</BackwardThrustButton>
	<YawAxisAlternate>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</YawAxisAlternate>
	<RollAxisAlternate>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</RollAxisAlternate>
	<PitchAxisAlternate>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</PitchAxisAlternate>
	<LateralThrustAlternate>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</LateralThrustAlternate>
	<VerticalThrustAlternate>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</VerticalThrustAlternate>
	<UseAlternateFlightValuesToggle>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
		<ToggleOn Value="1" />
	</UseAlternateFlightValuesToggle>
	<ThrottleAxis>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</ThrottleAxis>
	<ThrottleRange Value="" />
	<ToggleReverseThrottleInput>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
		<ToggleOn Value="1" />
	</ToggleReverseThrottleInput>
	<ForwardKey>
		<Primary Device="Keyboard" Key="Key_W" />
		<Secondary Device="{NoDevice}" Key="" />
	</ForwardKey>
	<BackwardKey>
		<Primary Device="Keyboard" Key="Key_S" />
		<Secondary Device="{NoDevice}" Key="" />
	</BackwardKey>
	<ThrottleIncrement Value="0.00000000" />
	<SetSpeedMinus100>
		<Primary Device="Keyboard" Key="Key_Numpad_9" />
		<Secondary Device="{NoDevice}" Key="" />
	</SetSpeedMinus100>
	<SetSpeedMinus75>
		<Primary Device="Keyboard" Key="Key_Numpad_8" />
		<Secondary Device="{NoDevice}" Key="" />
	</SetSpeedMinus75>
	<SetSpeedMinus50>
		<Primary Device="Keyboard" Key="Key_Numpad_7" />
		<Secondary Device="{NoDevice}" Key="" />
	</SetSpeedMinus50>
	<SetSpeedMinus25>
		<Primary Device="Keyboard" Key="Key_Numpad_6" />
		<Secondary Device="{NoDevice}" Key="" />
	</SetSpeedMinus25>
	<SetSpeedZero>
		<Primary Device="Keyboard" Key="Key_Numpad_0" />
		<Secondary Device="{NoDevice}" Key="" />
	</SetSpeedZero>
	<SetSpeed25>
		<Primary Device="Keyboard" Key="Key_Numpad_1" />
		<Secondary Device="{NoDevice}" Key="" />
	</SetSpeed25>
	<SetSpeed50>
		<Primary Device="Keyboard" Key="Key_Numpad_2" />
		<Secondary Device="{NoDevice}" Key="" />
	</SetSpeed50>
	<SetSpeed75>
		<Primary Device="Keyboard" Key="Key_Numpad_3" />
		<Secondary Device="{NoDevice}" Key="" />
	</SetSpeed75>
	<SetSpeed100>
		<Primary Device="Keyboard" Key="Key_Numpad_4" />
		<Secondary Device="{NoDevice}" Key="" />
	</SetSpeed100>
	<YawAxis_Landing>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</YawAxis_Landing>
	<YawLeftButton_Landing>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</YawLeftButton_Landing>
	<YawRightButton_Landing>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</YawRightButton_Landing>
	<YawToRollMode_Landing Value="" />
	<PitchAxis_Landing>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</PitchAxis_Landing>
	<PitchUpButton_Landing>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</PitchUpButton_Landing>
	<PitchDownButton_Landing>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</PitchDownButton_Landing>
	<RollAxis_Landing>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</RollAxis_Landing>
	<RollLeftButton_Landing>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</RollLeftButton_Landing>
	<RollRightButton_Landing>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</RollRightButton_Landing>
	<LateralThrust_Landing>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</LateralThrust_Landing>
	<LeftThrustButton_Landing>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</LeftThrustButton_Landing>
	<RightThrustButton_Landing>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</RightThrustButton_Landing>
	<VerticalThrust_Landing>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</VerticalThrust_Landing>
	<UpThrustButton_Landing>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</UpThrustButton_Landing>
	<DownThrustButton_Landing>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</DownThrustButton_Landing>
	<AheadThrust_Landing>
		<Binding Device="{NoDevice}" Key="" />
		<Inverted Value="0" />
		<Deadzone Value="0.00000000" />
	</AheadThrust_Landing>
	<ForwardThrustButton_Landing>
		<Primary Device="{NoDevice}" Key="" />
		<Secondary Device="{NoDevice}" Key="" />
	</ForwardThrustButton_Landing>
	<BackwardThrustB


antaresinsomnious

Индексы 59, 78 и 111-это единственные 3, которые возвращают полную строку, и я все еще не могу заставить ее этого не делать.