Нужна помощь по использованию XPathNavigator в C#?

Мой файл XML, как показано ниже. Он смешал схему и нормальные элементы.

<?xml version="1.0" encoding="utf-8"?>
<!-- R1 -->
<ax:root xmlns:ax="http://amecn/software/realtime/ax">
  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="EquipmentConstants">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element minOccurs="0" maxOccurs="unbounded" ref="EquipmentConstant" />
        </xsd:sequence>
      </xsd:complexType>
      <xsd:unique name="id">
        <xsd:selector xpath=".//EquipmentConstant" />
        <xsd:field xpath="@id" />
      </xsd:unique>
    </xsd:element>
    ......
    ......
  </xsd:schema>
  <EquipmentConstants xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <EquipmentConstant id="0">
      <Name>SerialNumber</Name>
      <Group>SYSTEM</Group>
      <Data>
        <Value min="0" max="10000000" scale_factor="0" unit="U_NO_UNITS" permission="NolimitedAndNoChangeable" type="xsd_string" enum="" flag="0">0</Value>
      </Data>
      <Description>Serial Number</Description>
    </EquipmentConstant>
    .....
    .....
  </EquipmentConstants>
</ax:root>

Мой код С#, как показано ниже. Я хочу зациклить элементы, начиная с (обходя все содержимое схемы)

<EquipmentConstants xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

XPathDocument doc = new XPathDocument("test.xml");
                XPathNavigator navigator = doc.CreateNavigator();

                navigator.MoveToRoot(); // <?xml version="1.0" encoding="utf-8"?>
                //navigator.MoveToFirstChild();   // <!-- R1 -->
                // 1st, I tried to use MoveToChield(), But I failed to move there.
                navigator.MoveToChild("EquipmentConstants"); 
                // Then, I also tried to use SelectSingleNode(). But I failed too. 
                navigator.SelectSingleNode("ax/EquipmentConstants");
                while (navigator.MoveToNext())
                {
                // do something.
                } 

Не могли бы вы дать мне несколько предложений. Спасибо.


person Nano HE    schedule 07.06.2010    source источник


Ответы (2)


Мое решение, как показано ниже.

            XPathDocument doc = new XPathDocument("test.xml");
            XPathNavigator navigator = doc.CreateNavigator();

            navigator.MoveToRoot(); // <?xml version="1.0" encoding="utf-8"?>
            navigator.MoveToFirstChild();   // <!-- R1 -->
            navigator.MoveToNext(); //   <ax:root xmlns:ax="http://amecn/software/realtime/ax">
            navigator.MoveToChild("EquipmentConstants", ""); // <EquipmentConstants xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

            navigator.MoveToFirstChild();   // <EquipmentConstant id="0">
            do
            {
            // Loop body;
            } while (navigator.MoveToNext());
person Nano HE    schedule 07.06.2010

person    schedule
comment
@Arseny, привет, в моем xml-файле только один EquipmentConstants. Могу ли я просто не использовать foreach на основе вашего кода? - person Nano HE; 07.06.2010
comment
Я предполагаю, что у вас есть корневой элемент EquipmentConstants, где находится список дочерних элементов EquipmentConstant. если это правильно, мой код выше перемещается через дочерние узлы. - person Arseny; 07.06.2010
comment
после navigator.MoveToRoot() я вставил ваш код. Я обнаружил, что код не работает. Похоже, select() не может работать. цикл foreach не войдет в блок EquipmentConstants. - person Nano HE; 07.06.2010
comment
в порядке. попробуйте этот /ax:root/EquipmentConstantsEquipmentConstant в методе Select. - person Arseny; 07.06.2010
comment
запрос, который вы вставляете в метод select, является выражением XPath. вот синтаксис Xpath w3schools.com/XPath/xpath_syntax.asp - person Arseny; 07.06.2010