Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么XML节点类型被读取为文本而不是元素_C#_Xml - Fatal编程技术网

C# 为什么XML节点类型被读取为文本而不是元素

C# 为什么XML节点类型被读取为文本而不是元素,c#,xml,C#,Xml,这是我第一次尝试从XML中读取数据,我遇到了一个问题,就是如何将XML文档的所有元素都视为相同的NodeType XML示例: <AFElement> <Name>InterfaceBuilderTestBreaker01</Name> <Template></Template> <PIInterface>ModbusE</PIInterface> </AFElement>

这是我第一次尝试从XML中读取数据,我遇到了一个问题,就是如何将XML文档的所有元素都视为相同的
NodeType

XML示例:

<AFElement>
    <Name>InterfaceBuilderTestBreaker01</Name>
    <Template></Template>
    <PIInterface>ModbusE</PIInterface>
</AFElement>
解析xml并将其读入对象的代码类似于:

while (reader.Read())
{
    switch (reader.NodeType)
    {
        case XmlNodeType.Element:
            switch (reader.Name)
            {
                case "PIInterface":
                    // move pointer to element value
                    reader.Read();
                    item.Interface = reader.Value;
                    // move pointer to end element
                    reader.Read();
                    break;
            }
    }
}
这有什么原因吗?我见过它以两种方式处理它(元素或文本),我认为快速的解决方案是在
节点类型的第一个
开关中添加一个case

任何帮助都会得到感激

更新: 在创建了一个简单的解析示例并发布到这里之后,我发现测试XML文件和实际XML文件之间没有相同的行为。XML看起来很相似,但不知何故它们并不相同

工作XML:

<?xml version="1.0" encoding="utf-8"?>
<Element xmlns="http://tempuri.org/ExampleParse.xsd">
  <AFElement>
    <Name>ExampleParseName01</Name>
    <Template>ExampleParseTemplate</Template>
    <PIInterface>ModbusE</PIInterface>
    <AFElement>
      <Name>ExampleParseName06</Name>
      <Template>ExampleParseTemplate</Template>
      <PIInterface>ModbusE</PIInterface>
      <AFElement>
        <Name>ExampleParseName07</Name>
        <Template>ExampleParseTemplate</Template>
        <PIInterface>ModbusE</PIInterface>
        <AFElement>
          <Name>ExampleParseName08</Name>
          <Template>ExampleParseTemplate</Template>
          <PIInterface>ModbusE</PIInterface>
        </AFElement>
      </AFElement>
    </AFElement>
  </AFElement>
  <AFElement>
    <Name>ExampleParseName02</Name>
    <Template>ExampleParseTemplate</Template>
    <PIInterface>ModbusE</PIInterface>
  </AFElement>
</Element>
<Element xmlns="http://tempuri.org/ExampleParse.xsd">
  <AFElement>
    <Name>InterfaceBuilderTestBreaker01</Name>
    <Template></Template>
    <PIInterface>ModbusE</PIInterface>
    <AllAttributes>
      <AFAttribute name="classic">
        <field name="ptclassname" value="ModbusE"/>
        <field name="pointsource" value="InterfaceBuilder01"/>
        <field name="instrumenttag" value="192.168.1.100"/>
      </AFAttribute>
    </AllAttributes>
    <AFElement>
      <Name>InterfaceBuilderTestBreaker02</Name>
      <Template></Template>
      <PIInterface>ModbusE</PIInterface>
      <AllAttributes>
        <AFAttribute name="classic">
          <field name="ptclassname" value="ModbusE"/>
            <field name="pointsource" value="InterfaceBuilder01"/>
            <field name="location1" value="1"/>
            <field name="location2" value="2"/>
            <field name="location3" value=""/>
            <field name="location4" value="2"/>
            <field name="location5" value=""/>
            <field name="instrumenttag" value="192.168.1.100"/>
        </AFAttribute>
      </AllAttributes>
    </AFElement>
    <AFElement>
      <Name>InterfaceBuilderTestBreaker03</Name>
      <Template></Template>
      <PIInterface>ModbusE</PIInterface>
      <AllAttributes>
         <AFAttribute name="classic">
            <field name="ptclassname" value="ModbusE"/>
            <field name="pointsource" value="InterfaceBuilder01"/>
            <field name="location1" value="1"/>
            <field name="location2" value="3"/>
            <field name="location3" value=""/>
            <field name="location4" value="3"/>
            <field name="instrumenttag" value="192.168.1.100"/>
         </AFAttribute>
       </AllAttributes>
    </AFElement>
    <AFElement>
      <Name>InterfaceBuilderTestMeter01</Name>
      <Template></Template>
      <PIInterface>ModbusE</PIInterface>
      <AllAttributes>
         <AFAttribute name="classic">
           <field name="ptclassname" value="ModbusE"/>
           <field name="pointsource" value="InterfaceBuilder02"/>
           <field name="instrumenttag" value="192.168.1.101"/>
           <field name="exdesc" value=""/>
         </AFAttribute>
      </AllAttributes>
     </AFElement>
   </AFElement>
</Element>

示例ParseName01
示例解析模板
莫德布斯
示例ParseName06
示例解析模板
莫德布斯
示例ParseName07
示例解析模板
莫德布斯
示例ParseName08
示例解析模板
莫德布斯
示例ParseName02
示例解析模板
莫德布斯
非工作XML:

<?xml version="1.0" encoding="utf-8"?>
<Element xmlns="http://tempuri.org/ExampleParse.xsd">
  <AFElement>
    <Name>ExampleParseName01</Name>
    <Template>ExampleParseTemplate</Template>
    <PIInterface>ModbusE</PIInterface>
    <AFElement>
      <Name>ExampleParseName06</Name>
      <Template>ExampleParseTemplate</Template>
      <PIInterface>ModbusE</PIInterface>
      <AFElement>
        <Name>ExampleParseName07</Name>
        <Template>ExampleParseTemplate</Template>
        <PIInterface>ModbusE</PIInterface>
        <AFElement>
          <Name>ExampleParseName08</Name>
          <Template>ExampleParseTemplate</Template>
          <PIInterface>ModbusE</PIInterface>
        </AFElement>
      </AFElement>
    </AFElement>
  </AFElement>
  <AFElement>
    <Name>ExampleParseName02</Name>
    <Template>ExampleParseTemplate</Template>
    <PIInterface>ModbusE</PIInterface>
  </AFElement>
</Element>
<Element xmlns="http://tempuri.org/ExampleParse.xsd">
  <AFElement>
    <Name>InterfaceBuilderTestBreaker01</Name>
    <Template></Template>
    <PIInterface>ModbusE</PIInterface>
    <AllAttributes>
      <AFAttribute name="classic">
        <field name="ptclassname" value="ModbusE"/>
        <field name="pointsource" value="InterfaceBuilder01"/>
        <field name="instrumenttag" value="192.168.1.100"/>
      </AFAttribute>
    </AllAttributes>
    <AFElement>
      <Name>InterfaceBuilderTestBreaker02</Name>
      <Template></Template>
      <PIInterface>ModbusE</PIInterface>
      <AllAttributes>
        <AFAttribute name="classic">
          <field name="ptclassname" value="ModbusE"/>
            <field name="pointsource" value="InterfaceBuilder01"/>
            <field name="location1" value="1"/>
            <field name="location2" value="2"/>
            <field name="location3" value=""/>
            <field name="location4" value="2"/>
            <field name="location5" value=""/>
            <field name="instrumenttag" value="192.168.1.100"/>
        </AFAttribute>
      </AllAttributes>
    </AFElement>
    <AFElement>
      <Name>InterfaceBuilderTestBreaker03</Name>
      <Template></Template>
      <PIInterface>ModbusE</PIInterface>
      <AllAttributes>
         <AFAttribute name="classic">
            <field name="ptclassname" value="ModbusE"/>
            <field name="pointsource" value="InterfaceBuilder01"/>
            <field name="location1" value="1"/>
            <field name="location2" value="3"/>
            <field name="location3" value=""/>
            <field name="location4" value="3"/>
            <field name="instrumenttag" value="192.168.1.100"/>
         </AFAttribute>
       </AllAttributes>
    </AFElement>
    <AFElement>
      <Name>InterfaceBuilderTestMeter01</Name>
      <Template></Template>
      <PIInterface>ModbusE</PIInterface>
      <AllAttributes>
         <AFAttribute name="classic">
           <field name="ptclassname" value="ModbusE"/>
           <field name="pointsource" value="InterfaceBuilder02"/>
           <field name="instrumenttag" value="192.168.1.101"/>
           <field name="exdesc" value=""/>
         </AFAttribute>
      </AllAttributes>
     </AFElement>
   </AFElement>
</Element>

接口BuilderTestBreaker01
莫德布斯
接口BuilderTestBreaker02
莫德布斯
接口BuilderTestBreaker03
莫德布斯
接口BuilderTestMeter01
莫德布斯
我没有想到
的元素会导致
元素受到不同的对待。其他不同之处在于,非工作XML是从Excel中的单元格和我手工组装的测试元素的脚本生成的。我看不出在产出上有任何差异,可以解释不同的处理或元素

我错过什么了吗

注意:XML是一个元素的层次结构,解析时应返回删除该层次结构的每个元素的列表。正是出于这个原因,我深入研究了底层接口。我愿意重写解析函数以使用不同的接口,但到目前为止,它还是按预期工作的

更新2: 根据keshlam的评论,完整示例代码块:

private static void internalParser(XmlReader reader, ref int c, ref ObservableCollection<DataHolder> List)
    {
        DataHolder data = new DataHolder();
        data.Title = "Interface" + c;
        c++;
        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    switch (reader.Name)
                    {
                        case "Name":
                            // move pointer to element value
                            reader.Read();

                            data.InterfaceName = reader.Value;
                            // move pointer to end element
                            reader.Read();
                            break;
                        case "Template":
                            // move pointer to element value
                            reader.Read();
                            data.ElementTemplate = reader.Value;
                            // move pointer to end element
                            reader.Read();
                            break;
                        case "PIInterface":
                            // move pointer to element value
                            reader.Read();
                            data.ElementInterface = reader.Value;
                            // move pointer to end element
                            reader.Read();
                            break;
                        case "AFElement":
                            // create new object for processing
                            internalParser(reader, ref c, ref List);
                            break;
                    }
                    break;
                case XmlNodeType.EndElement:
                    if (reader.Name == "AFElement")
                    {
                        List.Add(data) ;
                        return ;
                    }
                    break;
            }
        }
        return ;
    }
private static void internalParser(XmlReader阅读器,ref int c,ref observeCollection List)
{
数据持有者数据=新数据持有者();
data.Title=“接口”+c;
C++;
while(reader.Read())
{
开关(reader.NodeType)
{
case XmlNodeType.Element:
开关(reader.Name)
{
案例“名称”:
//将指针移动到元素值
reader.Read();
data.InterfaceName=reader.Value;
//将指针移动到结束元素
reader.Read();
打破
案例“模板”:
//将指针移动到元素值
reader.Read();
data.element模板=reader.Value;
//将指针移动到结束元素
reader.Read();
打破
案例“PIInterface”:
//将指针移动到元素值
reader.Read();
data.element接口=reader.Value;
//将指针移动到结束元素
reader.Read();
打破
案例“AFElement”:
//创建要处理的新对象
内部解析器(读卡器、参考c、参考列表);
打破
}
打破
案例XmlNodeType.EndElement:
if(reader.Name==“AFElement”)
{
列表。添加(数据);
返回;
}
打破
}
}
返回;
}

使用XLINQ;它更容易使用。你确定你读的是XML结构,而不是转义或引用的东西,所以它是文本吗?(例如,如果它包装在CDATA节中…@keshlam,则示例是xml文件的直接复制/粘贴。如果是这样,我必须假设问题出在您的代码中。演示故障的最小可运行示例可能(A)帮助我们诊断故障,(b)帮助您诊断故障。您确定直接使用XML拉式解析器提供的低级接口是编写应用程序的最佳方式吗?您不能使用为XML设计的高级语言,比如XSLT、XQuery或LINQ;或数据绑定;甚至是DOM?我认为作为一个初学者,你可能选择了错误的方法(但不知道你的问题,人们不能确定)。