我正在使用Microsoft的XmlLite DLL来解析一个简单的XML文件,使用示例XmlLiteReader中的代码。代码(C++)的基本部分是
while(S_OK == (hr = pReader->Read(&nodeType)))
{
switch(nodeType)
{
case XmlNodeType_Element:
// Get name...
WriteAttributes(pReader, es, attributes);
break;
case XmlNodeType_EndElement:
// Process end-of-element...
break;
}
和
HRESULT WriteAttributes(IXmlReader* pReader, CString& es, StringStringMap& attributes)
{
while(TRUE)
{
// Get and store an attribute...
HRESULT hrMove = pReader->MoveToNextAttribute();
}
// ...
}
所以,这是我的问题。使用XML输入,例如
<?xml version="1.0" encoding="utf-8"?>
<settings version="1.2">
<runID name="test" mode="N" take_data="Y">
<cell id="01">
<channel id="A" sample="something"/>
<channel id="B" sample="something else"/>
</cell>
<cell id="03">
<channel id="A" sample="other something"/>
<channel id="B" sample="other something else"/>
</cell>
</runID>
</settings>
一切都按预期工作,除了每行channel
末尾的/>
(指示元素channel
的结尾)未被识别为元素的结尾。channel
后面的连续节点类型是空格 (),然后是元素(第二个channel
)。
如何从 XmlLite 确定元素"通道"已结束?还是我误解了 XML 语法?
您可以使用函数 IsElementEmpty 测试元素是否以 />
结尾。