C# 为什么XML节点类型被读取为文本而不是元素
这是我第一次尝试从XML中读取数据,我遇到了一个问题,就是如何将XML文档的所有元素都视为相同的C# 为什么XML节点类型被读取为文本而不是元素,c#,xml,C#,Xml,这是我第一次尝试从XML中读取数据,我遇到了一个问题,就是如何将XML文档的所有元素都视为相同的NodeType XML示例: <AFElement> <Name>InterfaceBuilderTestBreaker01</Name> <Template></Template> <PIInterface>ModbusE</PIInterface> </AFElement>
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?我认为作为一个初学者,你可能选择了错误的方法(但不知道你的问题,人们不能确定)。