C++怎么解析XML的多个同类型结点?MessageBox测试的时候确实解析了三次,但只能解析第一个,该怎么解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++怎么解析XML的多个同类型结点?MessageBox测试的时候确实解析了三次,但只能解析第一个,该怎么解决?相关的知识,希望对你有一定的参考价值。

这是xml的代码
<root>
<note text="123">备注</note>
<note text="1456">备注</note>

<note text="897">备注</note>

</root>
这是我写的for循环解析代码
//读取note结点
CString notetest;//测试了中文能否识别的问题
for(int renote=0;renote<lengthOfArray;renote++)

//读取备注元素
childNode=(MSXML2::IXMLDOMElementPtr)(pDoc->selectSingleNode("//note"));//读取point元素
//结点的类型
// MSXML2::DOMNodeType nodeType;
childNode->get_nodeType(&nodeType);//获取结点的类型
// BSTR var;
childNode->get_nodeName(&var);//获取结点名
CString name=(char*)(_bstr_t)var;//元素名point
// VARIANT varVal;//存放了该元素的文本信息:备注
childNode->get_nodeTypedValue(&varVal);
// CString
strValue=(char*)(_bstr_t)varVal;

// MSXML2::IXMLDOMNamedNodeMapPtr pAttrs=NULL;
// MSXML2::IXMLDOMNodePtr pAttrItem;
childNode->get_attributes(&pAttrs);
long nCount;
pAttrs->get_length(&nCount);//获取属性的个数

for(int lengthArray=0;lengthArray<nCount;lengthArray++)//只有一个属性text,所以也是执行一次

pAttrs->get_item(lengthArray,&pAttrItem); //获取第i个属性
CString strAttrName=(char*)(_bstr_t)pAttrItem->nodeName; //获取结点的属性名
CString strAttrValue=(char*)(_bstr_t)pAttrItem->nodeTypedValue; //获取结点属性的值
//AfxMessageBox(strAttrValue);
notetest = strAttrValue;
m_csExpArrayNote[renote] = strAttrValue;

参考技术A 在c++中,少了一个分号就是少了整个程序。。。      追问

因为不是特别了解XML,现在只是拿来用用,我也知道设置的不是很合理,读取的时候控制不了指针往下走,所以都是读取第一个,整个代码有600行了,好像不能全部贴进来,现在想找一个方法控制这个childnode,去访问下一个,xml是我编辑的结构还比较清楚

参考技术B C++中建议使用Cmarkup操作XML文件 参考技术C 网上有xmllib 参考技术D 用开源类库 rapidxml

xml解析多个结点方法(C#)

解析多个结点的XML文件,格式如下:

<?xml version="1.0" encoding="utf-8"?>

<response>
  <flag>success</flag>
  <code>1</code>
  <message>成功单数:1 失败单数:0</message>
  <items>
    <item>
      <wareCode>ABC</wareCode>
      <itemCode>1000100</itemCode>
      <itemId>11111236</itemId>
      <inventoryType>ZP</inventoryType>
      <quantity>235</quantity>
      <lockQuantity>0</lockQuantity>
    </item>
  </items>
</response>

解析报文代码:

先取出response中的结点进行遍历,然后再取出item中的结点遍历。

var strResponse = from itemResponse in xDoc.Descendants("response")
                              select itemResponse;
        
            foreach (var items in strResponse)
            {
                string status = items.Element("flag").Value;

                if (status == "success")
                {
                    var itemResponse = from itemQuantity in xDoc.Descendants("item")
                                       select itemQuantity;

                    foreach (var item in itemResponse)
                    {
                        obj.PRODUCT_UPC = item.Element("itemCode").Value;
                        obj.PRODUCT_KD_PRODCODE = item.Element("itemId").Value;

                        obj.QUANTITY = Convert.ToInt64(item.Element("quantity").Value);
                        obj.PRODUCT_ID = prod_kd.PRODUCT_ID;
                        obj.LOCKQUANTITY = Convert.ToInt64(item.Element("lockQuantity").Value);
                        obj.PRODUCT_CODE = prod_kd.PRODUCT_CODE;
                        obj.PRODUCT_NAME = prod_kd.PRODUCT_NAME;
                    }
                }
            }

 

以上是关于C++怎么解析XML的多个同类型结点?MessageBox测试的时候确实解析了三次,但只能解析第一个,该怎么解决?的主要内容,如果未能解决你的问题,请参考以下文章

Android XML布局中,怎么设置两个Button按钮在同一行显示

在Python中解析多个xml文件

C++ BOOST库解析XML文件的问题

如何用Dom4j获取CDATA结点内容

xml解析-jaxp删除结点

xml解析-jaxp修改结点