请帮我找到正确的命名空间组合,这样我就可以用C#查询XML了

时间:2013-03-20 13:04:37

标签: c# xml xml-parsing xml-namespaces

我有一个我需要编辑的xml文件,它看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<PaketniUvozObrazaca xmlns="urn:PaketniUvozObrazaca_V1_0.xsd">
  <PodaciOPoslodavcu>
    <JIBPoslodavca>XXXXXXXXXX</JIBPoslodavca>
    <NazivPoslodavca>Comapyn</NazivPoslodavca>
    <BrojZahtjeva>1307</BrojZahtjeva>
    <DatumPodnosenja>2013-03-19</DatumPodnosenja>
  </PodaciOPoslodavcu>
  <Obrazac1022>
    <Dio1PodaciOPoslodavcuIPoreznomObvezniku>
      <JIBJMBPoslodavca>XXXXXXXXXX</JIBJMBPoslodavca>
      <Naziv>Compyny</Naziv>
      <AdresaSjedista>Adress </AdresaSjedista>
      <JMBZaposlenika>XXXXXXX</JMBZaposlenika>
      <ImeIPrezime>ad</ImeIPrezime>
      <AdresaPrebivalista>City</AdresaPrebivalista>
      <PoreznaGodina>2012</PoreznaGodina>
    </Dio1PodaciOPoslodavcuIPoreznomObvezniku>
</Obrazac1022>
</PaketniUvozObrazaca>

如果我想从这个文件中查询(选择节点)我应该如何引用命名空间?

static void Main(string[] args)
        {
            XmlDocument gip = new XmlDocument();
            gip.Load("C:\\vs2013tests\\adoGipko\\gip-2012.xml");

            XmlNamespaceManager nspm = new XmlNamespaceManager(gip.NameTable);
            nspm.AddNamespace("urn", "PaketniUvozObrazaca_V1_0");

            foreach (XmlNode uposlnik in gip.SelectNodes("//PaketniUvozObrazaca_V1_0/Obrazac1022", nspm))
            {
                Console.WriteLine(uposlnik.SelectSingleNode("Dio1PodaciOPoslodavcuIPoreznomObvezniku/ImeIPrezime",nspm).InnerText);

            }

            Console.ReadKey();
        }

1 个答案:

答案 0 :(得分:4)

您需要为名称空间指定名称,并在XML中指定uri。您使用的名称并不重要:

nspm.AddNamespace("d", "urn:PaketniUvozObrazaca_V1_0.xsd");

您现在必须为所有标记使用该名称:

foreach (XmlNode uposlnik in gip.SelectNodes("//d:PaketniUvozObrazaca/"+
                                             "d:Obrazac1022", nspm))
{
    Console.WriteLine(
        uposlnik.SelectSingleNode("d:Dio1PodaciOPoslodavcuIPoreznomObvezniku/"+
                                  "d:ImeIPrezime", nspm).InnerText);
}

此外,我在查询中修复了根标记。您使用了PaketniUvozObrazaca_V1_0,它是命名空间的一部分。您需要使用PaketniUvozObrazaca,这是根标记。