【问题标题】:Linq for xml parsing returns null element用于 xml 解析的 Linq 返回 null 元素
【发布时间】:2016-07-03 08:57:30
【问题描述】:

我的 xml 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<roulette xmlns="Mechanical" name="Ruleta">
  <params name="Mechanical Counters">
    <param name="C01">
      <comm>30313</comm>
      <command>INA</command>
      <factor>5</factor>
      <index>2</index>
      <meter>0</meter>
      <player>1023</player>
      <meterstring>ml_BET</meterstring>
    </param>
    <param name="C02">
      <comm>30313</comm>
      <command>INC</command>
      <factor>5</factor>
      <index>3</index>
      <meter>0</meter>
      <player>1023</player>
      <meterstring>ml_WIN_PAYTABLE</meterstring>
    </param>
    <param name="C03">
      <comm>30313</comm>
      <command>INE</command>
      <factor>5</factor>
      <index>0</index>
      <meter>0</meter>
      <player>1023</player>
      <meterstring>ml_CRE_IN_BA + ml_CRE_IN_REM + ml_CRE_IN_KEY + ml_CRE_IN_TICKET</meterstring>
    </param>
    <param name="C04">
      <comm>30313</comm>
      <command>ING</command>
      <factor>5</factor>
      <index>1</index>
      <meter>0</meter>
      <player>1023</player>
      <meterstring>ml_CRE_OUT_KEY + ml_CRE_OUT_HANDPAY + ml_CRE_OUT_HANDPAYJP + ml_CRE_OUT_REM + ml_CRE_OUT_TICKET</meterstring>
    </param>
    <param name="Percentage">
      <factor>10</factor>
    </param>
    <param name="WaitAnswer">
      <miliseconds>2500</miliseconds>
    </param>
  </params>
</roulette>

我正在尝试解析父 param 元素的 comm 元素,其中名称等于 C01 以将其显示在文本框中。

我的代码如下所示:

private void radioButton1_Click(object sender, EventArgs e)
        {
            //loadamo xml dokument
            var doc = XDocument.Load("mechanical.xml");
            //preberemo prvi element števca C01 comm
            var prvi = doc.Descendants("param")
    .Where(x => (string)x.Attribute("name") == "C01")
    .Elements("comm")
    .FirstOrDefault();
            if (prvi != null) { textBox1.Text = "Je element"; } else { textBox1.Text = "ni elementa"; }


        }

问题是它什么都没有解析出我(var prvi 是 null )但它不应该是代码。问题是什么?

【问题讨论】:

    标签: c# xml linq c#-4.0


    【解决方案1】:

    您的 xml 有一个默认命名空间 xmlns="Mechanical"。要访问元素,您必须指定命名空间。

    XNamespace ns = "Mechanical";
    
    var prvi = doc.Descendants(ns + "param")
        .Where(x => (string)x.Attribute("name") == "C01")
        .Elements(ns + "comm")
        .FirstOrDefault();
    

    请注意,默认命名空间并不直接应用于属性。

    更多信息请参见Namespace Defaulting

    【讨论】:

    • Tnx,现在完美运行!当我查看一个 xml 文件时,我在哪里可以看到它有一个命名空间?
    • 感谢您的回答和帮助,真的帮了我大忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2020-09-20
    相关资源
    最近更新 更多