Возможна ли вложенная итерация XPath? - PullRequest
1 голос
/ 14 марта 2011

У меня есть такой шаблон XML-файла, который получен из некоторых микросхем. Я хочу иметь возможность хранить данные каждого типа Pins Test в виде массива, чтобы позже я мог нарисовать его на декартовой диаграмме.

Структура данных выглядит следующим образом: <NUMBER></NUMBER> - это имя конкретного контакта микросхемы. <Curve Count=""> - это количество тестов, выполненных для вывода. <Type></Type> - это тип теста

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

В любом случае!У меня вопрос, как я могу получить эти значения?Я не прошу прямого ответа (но он оценен), но некоторые рекомендации, которые заставляют меня найти нить, действительно ценят.

РЕДАКТИРОВАТЬ: Если кто-то любезно даст мне код, чтобы иметь 3 напряжения и 3 токазначения из A1, я легко могу понять и продолжить сам.

Этот XML выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<Document>
  <Device>NEC555</Device>
  <Pins Count="3">
    <Pin>
      <Number>A1</Number>
      <Curves Count ="3">
        <Curve>
          <Type>PreStress</Type>
          <VIPairs Count="3">
            <VIPair>
              <Voltage>-2</Voltage>
              <Current>-0.003</Current>
            </VIPair>
            <VIPair>
              <Voltage>-1</Voltage>
              <Current>-0.002</Current>
            </VIPair>
            <VIPair>
              <Voltage>-0</Voltage>
              <Current>-0.001</Current>
            </VIPair>
          </VIPairs>
        </Curve>
        <Curve>
          <Type>PreFail</Type>
          <VIPairs Count="3">
            <VIPair>
              <Voltage>-2</Voltage>
              <Current>-0.003</Current>
            </VIPair>
            <VIPair>
              <Voltage>-1</Voltage>
              <Current>-0.002</Current>
            </VIPair>
            <VIPair>
              <Voltage>-0</Voltage>
              <Current>-0.001</Current>
            </VIPair>
          </VIPairs>
        </Curve>
        <Curve>
          <Type>PostFail</Type>
          <VIPairs Count="0">
          </VIPairs>
        </Curve>
      </Curves>
    </Pin>
    <Pin>
      <Number>B1</Number>
      <Curves Count ="3">
        <Curve>
          <Type>PreStress</Type>
          <VIPairs Count="3">
            <VIPair>
              <Voltage>-3</Voltage>
              <Current>-0.005</Current>
            </VIPair>
            <VIPair>
              <Voltage>-1</Voltage>
              <Current>-0.002</Current>
            </VIPair>
            <VIPair>
              <Voltage>-0</Voltage>
              <Current>-0.001</Current>
            </VIPair>
          </VIPairs>
        </Curve>
        <Curve>
          <Type>PreFail</Type>
          <VIPairs Count="3">
            <VIPair>
              <Voltage>-3</Voltage>
              <Current>-0.003</Current>
            </VIPair>
            <VIPair>
              <Voltage>-1</Voltage>
              <Current>-0.002</Current>
            </VIPair>
            <VIPair>
              <Voltage>-0</Voltage>
              <Current>-0.001</Current>
            </VIPair>
          </VIPairs>
        </Curve>
        <Curve>
          <Type>PostFail</Type>
          <VIPairs Count="0">
          </VIPairs>
        </Curve>
      </Curves>
    </Pin>
  </Pins>
</Document>

Ответы [ 3 ]

0 голосов
/ 14 марта 2011

Вы можете использовать LINQ-to-XML, например:

var doc = XDocument.Parse(xml);
var data = from pin in doc.Descendants("Pin")
            select new
            {
                Number = pin.Element("Number").Value,
                Curves =
                    from curve in pin.Element("Curves").Descendants("Curve")
                    select new
                    {
                        Type = curve.Element("Type").Value,
                        VIPairs =
                            from pair in curve.Descendants("VIPair")
                            select new
                            {
                                Voltage = pair.Element("Voltage").Value,
                                Current = pair.Element("Current").Value
                            }
                    }
            };
0 голосов
/ 14 марта 2011

Как бы мне ни хотелось использовать LINQ и XDocument, в этом случае XPath проще.

Учитывая ваш XML, этот XPath находит все элементы VIPair в элементе Pin сданный Number и элемент Curve с заданным Type:

/Document/Device/Pins/Pin[Number='A1']/Curves/Curve[Type='PreStress']/VIPairs/VIPair

Используя XmlDocument, код для получения трех значений напряжения и тока будет выглядеть следующим образом:

string number = "A1";
string type = "PreStress"
string xpath = string.Format(
   "/Document/Device/Pins/Pin[Number='{0}']/Curves/Curve[Type='{1}']/VIPairs/VIPair",
   number,
   type);
foreach (XmlElement viPair in doc.SelectNodes(xpath))
{
   string current = viPair.SelectSingleNode("Current").Value;
   string voltage = viPair.SelectSingleNode("Voltage").Value;
}

Используя XDocument, код будет выглядеть следующим образом:

var values = doc.XPathSelectElements(xpath)
   .Select(x => new { Voltage = x.Element("Voltage").Value(),
                      Current = x.Element("Current").Value() });

Если ваш документ не был предварительно проверен на соответствие схеме, вы можете захотеть выполнить последний тест узла в XPath VIPair[Current and Voltage], чтобы код не завершился ошибкой, если в элементе VIPair отсутствует один из этих дочерних элементов.(В качестве альтернативы вы можете на самом деле хотеть код, выдавший исключение, если это произойдет; это действительно зависит от качества исходных данных.)

0 голосов
/ 14 марта 2011

Взгляните на XDocument

В вашем конкретном случае это будет выглядеть примерно так:

XDocument doc = XDocument.Load("yourFilePath");

var data = (from pins in doc.Element("Pins").Descendants
            from pin in pins.Element("Pin")
            from curve in pin.Element("Curves").Element("Curve")
            from pair in curve.Element("VIPairs").Descendants.Descendants()
            select new {
                          Voltage = pair.Element("Voltage").Value(),
                          Current = pair.Element("Current").Value()
        });

Этот код не был проверен

...