当前位置 : 主页 > 编程语言 > c语言 >

c# – 如何解决“无法识别的元素’elementName’. (第x行)(第x行)“?

来源:互联网 收集:自由互联 发布时间:2021-06-25
我有以下代码 var section = new CustomConfigurationSection();section.SectionInformation.Type = "System.Configuration.NameValueFileSectionHandler";section.SectionInformation.SetRawXml(sectionXml);configuration.Sections.Add(sectionName,
我有以下代码

var section = new CustomConfigurationSection();
section.SectionInformation.Type = "System.Configuration.NameValueFileSectionHandler";
section.SectionInformation.SetRawXml(sectionXml);
configuration.Sections.Add(sectionName, section);

最后一行抛出:

ConfigurationErrorsException An error
occurred executing the configuration
section handler for monitor.

内部异常:

Unrecognized element ‘screens’. (line
1) (line 1)

CustomConfigurationSection的定义:

public class CustomConfigurationSection: ConfigurationSection
{
    public CustomConfigurationSection()
    {
    }
}

configuration是自定义类的实例,它具有名为Sections的属性,其类型为“ConfigurationSectionCollection”.

sectionXml中传入的xml是:

<monitor>
  <screens>
    <screen>
      <regions>
        <region>
          <labelCoordinates />
          <startupApplication>Internet</startupApplication>
          <color />
          <width>426</width>
          <height>266</height>
          <x1>0</x1>
          <x2>0</x2>
          <y1>0</y1>
          <y2>0</y2>
        </region>
      </regions>
      <height>800</height>
      <width>1280</width>
    </screen>
    <screen>
      <regions />
      <height>0</height>
      <width>0</width>
    </screen>
  </screens>
</monitor>

我怎样才能让它发挥作用?

看了你的例子,我可以看到它不起作用的一个原因是你正在使用NameValueFileSectionHandler.如果我没记错的话,这只允许以下语法:

<YourSectionName>
  <add key="monitor.region.x" value="0"/>
<YourSectionName>

基于您想要使用的xml,您可能需要完全实现config部分类.所以你会得到类似以下的东西:

class ServiceResponseSection : ConfigurationSection
{
    [ConfigurationProperty("ServiceResponses")]
    [ConfigurationCollection(typeof(ServiceResponse), AddItemName = "addServiceResponse", RemoveItemName = "removeServiceResponse", ClearItemsName = "clearServiceResponses")]
    public ServiceResponses ServiceResponses
    {
        get { return this["ServiceResponses"] as ServiceResponses; }
    }

}

public class ServiceResponses : ConfigurationElementCollection
{
    public override ConfigurationElementCollectionType CollectionType
    {
        get
        {
            return ConfigurationElementCollectionType.AddRemoveClearMap;
        }
    }

    public ServiceResponse this[int index]
    {
        get
        {
            return (ServiceResponse)this.BaseGet(index);
        }
        set
        {
            if (this.BaseGet(index) != null)
            {
                this.BaseRemoveAt(index);
            }
            this.BaseAdd(index, value);
        }
    }

    public new ServiceResponse this[string responseString]
    {
        get
        {
            return (ServiceResponse)this.BaseGet(responseString);
        }
        set
        {
            if (this.BaseGet(responseString) != null)
            {
                this.BaseRemoveAt(this.BaseIndexOf(this.BaseGet(responseString)));
            }
            this.BaseAdd(value);
        }
    }

    public void Add(ServiceResponse ServiceResponse)
    {
        this.BaseAdd(ServiceResponse);
    }

    public void Clear()
    {
        this.BaseClear();
    }

    protected override ConfigurationElement CreateNewElement()
    {
        return new ServiceResponse();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((ServiceResponse)element).ResponseString;
    }

    public void Remove(ServiceResponse element)
    {
        BaseRemove(element.ResponseString);
    }

    public void Remove(string responseString)
    {
        BaseRemove(responseString);
    }

    public void RemoveAt(int index)
    {
        BaseRemoveAt(index);
    }

}

public class ServiceResponse : ConfigurationElement
{
    private int m_tryCount;

    public ServiceResponse()
    {
        this.m_tryCount = 0;
    }

    [ConfigurationProperty("responseString")]
    public string ResponseString
    {
        get { return (String)this["responseString"]; }
        set { this["responseString"] = value; }
    }

    [ConfigurationProperty("matchWholeString")]
    public bool MatchWholeString
    {
        get
        {
            return (bool)this["matchWholeString"];
        }
        set
        {
            this["matchWholeString"] = value.ToString();
        }
    }

    [ConfigurationProperty("retryCount")]
    public int RetryCount
    {
        get
        {
            return (int)this["retryCount"];
        }
        set
        {
            this["retryCount"] = value.ToString();
        }
    }

    [ConfigurationProperty("failsProcess")]
    public bool FailsProcess
    {
        get
        {
            return (bool)this["failsProcess"];
        }
        set
        {
            this["failsProcess"] = value.ToString();
        }
    }

    public int TryCount
    {
        get { return this.m_tryCount; }
        set { this.m_tryCount = value; }
    }

    public void Reset()
    {
        this.m_tryCount = 0;
    }

}

然后使用xml,如下所示:

<ServiceResponseList>
    <ServiceResponses>
        <clearServiceResponses/>
        <addServiceResponse responseString="API Server Login Error" matchWholeString="false" retryCount="5" failsProcess="false"/>
    </ServiceResponses>
</ServiceResponseList>

重点是我正在使用一个集合(在你的例子中,你实际上有几个).在该集合中是我代表的对象.因此,要让它解析你拥有的xml,你必须创建一个部分处理程序来匹配你正在使用的.

根据我的示例,您可能希望将xml更改为以下内容:

<monitor>
  <screens>
    <screen height="800" width="1280">
      <regions>
         <region startupApplication="Internet" width="426" height="266" x1="0" x2="0" y1="0" y2="0"/>
     </regions>
   </screen>
  </screens>
</monitor>

然后,您可以使用类似于我的示例的类.虽然你可能得到你想要的东西,但你需要使用其他配置项来让它以这种方式工作.

希望有所帮助.

网友评论