0

こんにちは、以下は私が使用しているxmlのサンプルです。personData ノードから開始して結果を反復できるように考えられるあらゆる種類のオプションを試してみましたが、ルートから各子ノードを手動で移動しない限り、何も試していないようです。ルートから始めずにこれを行う方法について誰でもアドバイスできますか

私のコードは現在

using (var r = File.OpenText(@"C:\S\sp.xml"))
        {
            XPathDocument document = new XPathDocument(XmlReader.Create(r));
            XPathNavigator xPathNav = document.CreateNavigator();

            XmlNamespaceManager nsmgr = new XmlNamespaceManager(xPathNav.NameTable);
            nsmgr.AddNamespace("g2", "http://person.transferobject.com/xsd");

            XPathNodeIterator xni = xPathNav.Select("/g2:companys/g2:company/g2:person/g2:personData", nsmgr);

            foreach (XPathNavigator nav in xni)
                Console.WriteLine(nav.Name);
        }

XML

<?xml version="1.0" encoding="UTF-8"?>
<Header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<dataSource xmlns="http://person.transferobject.com/xsd">IG2</dataSource>
<dateTime xmlns="http://person.transferobject.com/xsd">Thu Mar 21 15:56:42 GMT 2013</dateTime>
<formatVersion xmlns="http://person.transferobject.com/xsd">2.0</formatVersion>
<companys xmlns="http://person.transferobject.com/xsd">
<company>
    <errorMessages xsi:nil="true"/>
    <person>
        <personData>
            <address>
                <address1 xmlns="http://transferobject.com/xsd">37 Smith St</address1>
                <county xmlns="http://transferobject.com/xsd">COUNTY-37</county>
                <postcode xmlns="http://transferobject.com/xsd">Po12 123</postcode>
            </address>
            <basicDetails>
                <currentFirstName xmlns="http://transferobject.com/xsd">Fred</currentFirstName>
                <currentLastName xmlns="http://transferobject.com/xsd">Bloggs</currentLastName >
                <currentStage xmlns="http://transferobject.com/xsd">H1</currentStage>
                <currentGroup xmlns="http://transferobject.com/xsd">3</currentGroup>
                <dob xmlns="http://transferobject.com/xsd">2000-04-25</dob>
                <email xmlns="http://transferobject.com/xsd">AN@AN.AOM</email>
                <entryDate xmlns="http://transferobject.com/xsd">2003-09-03</entryDate>
            </basicDetails>
        </personData>
        <personData>
            <address>
                <address1 xmlns="http://transferobject.com/xsd">37 Smith St</address1>
                <county xmlns="http://transferobject.com/xsd">COUNTY-37</county>
                <postcode xmlns="http://transferobject.com/xsd">Po12 123</postcode>
            </address>
            <basicDetails>
                <currentFirstName xmlns="http://transferobject.com/xsd">John</currentFirstName>
                <currentLastName xmlns="http://transferobject.com/xsd">Bloggs</currentLastName >
                <currentStage xmlns="http://transferobject.com/xsd">H1</currentStage>
                <currentGroup xmlns="http://transferobject.com/xsd">3</currentGroup>
                <dob xmlns="http://transferobject.com/xsd">1999-04-25</dob>
                <email xmlns="http://transferobject.com/xsd">AN@AN.AOM</email>
                <entryDate xmlns="http://transferobject.com/xsd">2003-09-03</entryDate>
            </basicDetails>
        </personData>
    </person>
</company>
</companys>
</header>
4

2 に答える 2

3

XPathを使用していることは知っていますが、XPathで回答があるので、Linqを使用して回答します。

using System;
using System.Linq;
using System.Xml.Linq;

namespace xmlTest
{
    class Program
    {
        static void Main()
        {
            XDocument doc = XDocument.Load("C:\\Users\\me\\Desktop\\so.xml");
            var personDataDetails = (from p in doc.Descendants().Elements()                                     
                                     where p.Name.LocalName == "personData"
                                         select p);

            foreach (var item in personDataDetails)
            {
                Console.WriteLine(item.ToString());
            }

            Console.ReadKey();
        }
    }
}
于 2013-03-22T13:33:19.977 に答える
0

personDataフルパスをリストせずにノードを反復処理する方法を尋ねているだけですか?それがあなたがしたいことであるならば、あなたはただこれをすることができます:

XPathNodeIterator xni = xPathNav.Select("//g2:personData", nsmgr);
于 2013-03-22T13:11:32.440 に答える