- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一些程序,从 xml 文档中检索某些值,并使用嵌套结构指针来帮助我管理数据。
我的结构之一中的字符串值遇到意外行为:
这是程序:
void parseInlineElements(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile){
do {
if (xmlStrcmp (node->name, XMLSTR("AdSystem")) == 0){
xmlFile->Ads->data->Inline->AdSystem = (char *)node->children->content; // does not work - displays �9;
xmlFile->Ads->data->Inline->AdSystem = "Works"; // works
printf ((char *)node->children->content); // works
}
else if (xmlStrcmp (node->name, XMLSTR("Creatives")) == 0){
parseCreatives (doc, node->children, xmlFile);
}
} while((node = node->next));
}
这是我遇到问题的行:
xmlFile->Ads->data->Inline->AdSystem = (char *)node->children->content;
当我在程序中测试结果时,该值看起来没有指向内存中的正确位置,因为它会产生垃圾,即:“�9”,其中预期值为“广告系统”
如果我存储测试值“Works” - 这里没有问题
如果我什至打印节点值,这也有效:“广告系统”
提前致谢
- 头文件
/*
* daastXML.h
*
* Created on: Nov 27, 2015
* Author: hearme
*/
#ifndef DAASTXML_H_
#define DAASTXML_H_
#define VECTOR_INITIAL_CAPACITY 100
// Define a vector type
typedef struct {
int size; // slots used so far
int capacity; // total available slots
struct daastAd *data; // array of ads we're storing
char * testData;
} VectorAds;
typedef struct {
int size; // slots used so far
int capacity; // total available slots
struct daastCreative *data; // array of ads we're storing
} VectorCreatives;
typedef struct {
int size;
int capacity;
struct daastMediaFile *data;
} VectorMediaFiles;
struct daastInline {
// Required elements
char *AdTitle;
char *Impression;
VectorCreatives *Creatives;
char *Category;
// Optional elements
char *AdSystem;
char *Description;
char *Advertiser;
char *Expires;
// Multiple survey urls
// Multiple error urls
char *Pricing;
// Extensions - for custom xml extensions
};
struct daastXML {
char *version;
VectorAds *Ads;
};
struct daastAd {
char *id;
char *sequence;
struct daastInline *Inline;
};
struct daastMediaFile {
char *id;
char *delivery;
char *type;
char *url;
char *bitRate;
};
struct daastLinear {
char *duration;
VectorMediaFiles MediaFiles;
};
struct daastCreative {
struct daastLinear linear;
};
// Main handler
void processDaast (char * filePath, struct daastXML *xmlFile);
// Methods used to manage Ads collection
void vectorAds_init(VectorAds *vector);
void vectorAds_append(VectorAds *vector, struct daastAd value);
struct daastAd vectorAds_get(VectorAds *vector, int index);
void vectorAds_set(VectorAds *vector, int index, struct daastAd value);
void vectorAds_double_capacity_if_full(VectorAds *vector);
void vectorAds_free(VectorAds *vector);
// Methods used to manage Creatives collection
void vectorCreatives_init(VectorCreatives *vector);
void vectorCreatives_append(VectorCreatives *vector, struct daastCreative value);
struct daastCreative VectorCreatives_get(VectorCreatives *vector, int index);
void vectorCreatives_set(VectorCreatives *vector, int index, struct daastCreative value);
void vectorCreatives_double_capacity_if_full(VectorCreatives *vector);
void vectorCreatives_free(VectorCreatives *vector);
// Methods used to manage Creatives collection
void vectorMediaFiles_init(VectorMediaFiles *vector);
void vectorMediaFiles_append(VectorMediaFiles *vector, struct daastMediaFile value);
struct daastMediaFile vectorMediaFiles_get(VectorMediaFiles *vector, int index);
void vectorMediaFiles_set(VectorMediaFiles *vector, int index, struct daastMediaFile value);
void vectorMediaFiles_double_capacity_if_full(VectorMediaFiles *vector);
void vectorMediaFiles_free(VectorMediaFiles *vector);
#endif /* DAASTXML_H_ */
C 文件 /* * daastXML.c * * 创建于:2015 年 11 月 27 日 * 作者: 听美 */
#ifndef DAASTXML_C_
#define DAASTXML_C_
#define XMLSTR(str) ((xmlChar *)(str))
#include "daastXML.h"
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void parseAds(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile);
void parseInline(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile);
void parseInlineElements(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile);
void parseCreatives(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile);
void parseCreativesElements(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile);
void parseCreativeElements(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile);
void parseLinear (xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile);
void parseMediaFiles (xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile);
void processDaast (char * filePath, struct daastXML *xmlFile){
xmlDocPtr doc;
xmlNodePtr node;
doc = xmlParseFile(filePath);
node = xmlDocGetRootElement(doc);
if (xmlStrcmp (node->name, XMLSTR("DAAST")) == 0){
xmlFile->version = (char *)xmlGetProp(node, XMLSTR("version"));
parseAds(doc, node->children, xmlFile);
}
xmlFreeDoc(doc);
}
void parseAds(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile){
// Allocate new instance of the VectorAds and assign it to the xmlFile, set default data
VectorAds *Ads;
Ads = (VectorAds *) malloc (sizeof(VectorAds));
Ads->testData = "testData";
xmlFile->Ads = Ads;
// Initialise the vector
vectorAds_init(xmlFile->Ads);
do {
if (node == NULL) break;
if (xmlIsBlankNode(node)) continue;
if (xmlStrcmp (node->name, XMLSTR("Ad")) == 0) {
// Set up new advert
struct daastAd *newAd;
newAd = (struct daastAd *) malloc (sizeof(struct daastAd));
// Set add properties
newAd->id = (char *)xmlGetProp(node, XMLSTR("id"));
newAd->sequence = (char *)xmlGetProp(node, XMLSTR("sequence"));
vectorAds_append(xmlFile->Ads, *newAd);
// At this point we need to get the inline (or wrapper) info *** WRAPPER NOT INTEGRATED ***
parseInline (doc, node->children, xmlFile);
}
} while ((node = node->next));
}
void parseInline (xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile){
// Set up Inline Property Here
struct daastInline *Inline;
Inline = (struct daastInline *) malloc (sizeof(struct daastInline));
// Assing Inline Property
xmlFile->Ads->data->Inline = Inline;
do {
if (node->type == XML_ELEMENT_NODE){
if (xmlStrcmp (node->name, XMLSTR("InLine")) == 0){
// Various parses at this level
parseInlineElements(doc, node->children, xmlFile);
//xmlFile->Ads->data->Inline->AdSystem = "AdSystem";
// Should this be here?
//parseCreatives (doc, node->children, xmlFile);
break;
}
}
} while((node = node->next));
}
void parseInlineElements(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile){
// loop through Inline child elements, and pick out the values
//*
do {
if (xmlStrcmp (node->name, XMLSTR("AdSystem")) == 0){
char *nodeValue = (char *) node->children->content;
xmlFile->Ads->data->Inline->AdSystem = malloc (sizeof(char));
strcpy (xmlFile->Ads->data->Inline->AdSystem, nodeValue);
}
else if (xmlStrcmp (node->name, XMLSTR("AdTitle")) == 0){
char *nodeValue = (char *) node->children->content;
xmlFile->Ads->data->Inline->AdTitle = malloc (sizeof(char));
strcpy (xmlFile->Ads->data->Inline->AdTitle, nodeValue);
}
else if (xmlStrcmp (node->name, XMLSTR("Category")) == 0){
char *nodeValue = "";
nodeValue = (char *) node->children->content;
xmlFile->Ads->data->Inline->Category = malloc (sizeof(char));
strcpy (xmlFile->Ads->data->Inline->Category, nodeValue);
}
else if (xmlStrcmp (node->name, XMLSTR("Advertiser")) == 0){
char *nodeValue = (char *) node->children->content;
xmlFile->Ads->data->Inline->Advertiser = malloc (sizeof(char));
strcpy (xmlFile->Ads->data->Inline->Advertiser, nodeValue);
}
else if (xmlStrcmp (node->name, XMLSTR("Pricing")) == 0){
char *nodeValue = (char *) node->children->content;
xmlFile->Ads->data->Inline->Pricing = malloc (sizeof(char));
strcpy (xmlFile->Ads->data->Inline->Pricing, nodeValue);
}
else if (xmlStrcmp (node->name, XMLSTR("Expires")) == 0){
char *nodeValue = (char *) node->children->content;
xmlFile->Ads->data->Inline->Expires = malloc (sizeof(char));
strcpy (xmlFile->Ads->data->Inline->Expires, nodeValue);
}
// else if (xmlStrcmp (node->name, XMLSTR("Impression")) == 0){
// char *nodeValue = (char *) node->children->next->content;
// xmlFile->Ads->data->Inline->Impression = malloc (sizeof(char));
// strcpy (xmlFile->Ads->data->Inline->Impression, nodeValue);
//
// }
else if (xmlStrcmp (node->name, XMLSTR("Creatives")) == 0){
parseCreatives (doc, node->children, xmlFile);
}
} while((node = node->next));
}
void parseCreatives(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile){
// Need to set up a new Creatives and assign it to the nested struct pointer
VectorCreatives *Creatives;
Creatives = (VectorCreatives *) malloc (sizeof(VectorCreatives));
VectorAds *Ads;
Ads = (VectorAds *) malloc (sizeof(VectorAds));
xmlFile->Ads->data->Inline->Creatives = Creatives;
vectorCreatives_init(xmlFile->Ads->data->Inline->Creatives);
//*parseCreativesElements(doc, node->next, xmlFile);
}
void parseCreativesElements(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile){
do {
// Loop through the creatives - find the individual Creatives
if (xmlStrcmp (node->name, XMLSTR("Creative")) == 0){
// Various parses at this level
parseCreativeElements(doc, node->children, xmlFile);
}
} while ((node = node->next));
}
void parseCreativeElements(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile){
do {
if (xmlStrcmp (node->name, XMLSTR("Linear")) == 0){
// Linear branch
parseLinear(doc, node->children, xmlFile);
} else if (xmlStrcmp (node->name, XMLSTR("CompanionAds")) == 0){
// Companion Ad branch
}
} while ((node = node->next));
}
void parseLinear(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile){
do {
if (xmlStrcmp (node->name, XMLSTR("Duration")) == 0){
struct daastCreative newCreative;
//*newCreative.linear.duration = node->children->content;
//*vectorCreatives_append(&xmlFile->Ads.data->Inline.Creatives, newCreative);
} else if (xmlStrcmp (node->name, XMLSTR("MediaFiles")) == 0){
//parseMediaFiles(doc,node->children,xmlFile);
}
} while ((node = node->next));
}
void parseMediaFiles(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile){
//* vectorMediaFiles_init(&xmlFile->Ads.data->Inline.Creatives.data->linear.MediaFiles);
do {
// Store all occurrences of Media Files
if (xmlStrcmp (node->name, XMLSTR("MediaFile")) == 0){
// Create a new Media File, and append
struct daastMediaFile newMediaFile;
newMediaFile.url = (char *) node->children->next->content;
newMediaFile.id = (char *)xmlGetProp(node, XMLSTR("id"));
newMediaFile.type = (char *)xmlGetProp(node, XMLSTR("type"));
newMediaFile.bitRate = (char *)xmlGetProp(node, XMLSTR("bitrate"));
newMediaFile.delivery = (char *)xmlGetProp(node, XMLSTR("delivery"));
//*vectorMediaFiles_append(&xmlFile->Ads.data->Inline.Creatives.data->linear.MediaFiles, newMediaFile);
}
} while ((node = node->next));
}
// ***************************************************************
// ***************************************************************
// ***************************************************************
// ***************************************************************
// Methods to manage collection (Ads)
void vectorAds_init(VectorAds *vector) {
// initialize size and capacity
vector->size = 0;
vector->capacity = VECTOR_INITIAL_CAPACITY;
// allocate memory for vector->data
vector->data = malloc(sizeof(struct daastAd) * vector->capacity);
}
void vectorAds_append(VectorAds *vector, struct daastAd value) {
// make sure there's room to expand into
vectorAds_double_capacity_if_full(vector);
// append the value and increment vector->size
vector->data[vector->size++] = value;
}
struct daastAd vectorAds_get(VectorAds *vector, int index) {
if (index >= vector->size || index < 0) {
printf("Index %d out of bounds for vector of size %d\n", index, vector->size);
exit(1);
}
return vector->data[index];
}
void vectorAds_set(VectorAds *vector, int index, struct daastAd value) {
// zero fill the vector up to the desired index
struct daastAd zero;
while (index >= vector->size) {
vectorAds_append(vector, zero);
}
// set the value at the desired index
vector->data[index] = value;
}
void vectorAds_double_capacity_if_full(VectorAds *vector) {
if (vector->size >= vector->capacity) {
// double vector->capacity and resize the allocated memory accordingly
vector->capacity *= 2;
vector->data = realloc(vector->data, sizeof(struct daastAd) * vector->capacity);
}
}
void vectorAds_free(VectorAds *vector) {
free(vector->data);
}
// Methods to manage Creatives Vector
void vectorCreatives_init(VectorCreatives *vector) {
// initialize size and capacity
vector->size = 0;
vector->capacity = VECTOR_INITIAL_CAPACITY;
// allocate memory for vector->data
vector->data = malloc(sizeof(struct daastCreative) * vector->capacity);
}
void vectorCreatives_append(VectorCreatives *vector, struct daastCreative value) {
// make sure there's room to expand into
vectorCreatives_double_capacity_if_full(vector);
// append the value and increment vector->size
vector->data[vector->size++] = value;
}
struct daastCreative vectorCreatives_get(VectorCreatives *vector, int index) {
if (index >= vector->size || index < 0) {
printf("Index %d out of bounds for vector of size %d\n", index, vector->size);
exit(1);
}
return vector->data[index];
}
void vectorCreatives_set(VectorCreatives *vector, int index, struct daastCreative value) {
// zero fill the vector up to the desired index
struct daastCreative zero;
while (index >= vector->size) {
vectorCreatives_append(vector, zero);
}
// set the value at the desired index
vector->data[index] = value;
}
void vectorCreatives_double_capacity_if_full(VectorCreatives *vector) {
if (vector->size >= vector->capacity) {
// double vector->capacity and resize the allocated memory accordingly
vector->capacity *= 2;
vector->data = realloc(vector->data, sizeof(struct daastCreative) * vector->capacity);
}
}
void vectorCreatives_free(VectorCreatives *vector) {
free(vector->data);
}
// Methods used to manage MediaFiles Vector
void vectorMediaFiles_init(VectorMediaFiles *vector) {
// initialize size and capacity
vector->size = 0;
vector->capacity = VECTOR_INITIAL_CAPACITY;
// allocate memory for vector->data
vector->data = malloc(sizeof(struct daastMediaFile) * vector->capacity);
}
void vectorMediaFiles_append(VectorMediaFiles *vector, struct daastMediaFile value) {
// make sure there's room to expand into
vectorMediaFiles_double_capacity_if_full(vector);
// append the value and increment vector->size
vector->data[vector->size++] = value;
}
struct daastMediaFile vectorMediaFiles_get(VectorMediaFiles *vector, int index) {
if (index >= vector->size || index < 0) {
printf("Index %d out of bounds for vector of size %d\n", index, vector->size);
exit(1);
}
return vector->data[index];
}
void vectorMediaFiles_set(VectorMediaFiles *vector, int index, struct daastMediaFile value) {
// zero fill the vector up to the desired index
struct daastMediaFile zero;
while (index >= vector->size) {
vectorMediaFiles_append(vector, zero);
}
// set the value at the desired index
vector->data[index] = value;
}
void vectorMediaFiles_double_capacity_if_full(VectorMediaFiles *vector) {
if (vector->size >= vector->capacity) {
// double vector->capacity and resize the allocated memory accordingly
vector->capacity *= 2;
vector->data = realloc(vector->data, sizeof(struct daastMediaFile) * vector->capacity);
}
}
void vectorMediaFiles_free(VectorMediaFiles *vector) {
free(vector->data);
}
#endif /* DAASTXML_C_ */
链接到 XML:http://hearme.fm/ars.xml
最佳答案
好的,
我已经修复了错误,但它看起来不是最干净的代码,也许有人可以建议这是否可以?
char *nodeValue = (char*) node->children->content;
xmlFile->Ads->data->Inline->AdSystem = (char *) malloc (sizeof(char));
strcpy (xmlFile->Ads->data->Inline->AdSystem, nodeValue);
关于char* 从嵌套结构中的过程产生意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34042222/
如果我声明了类似的类型 type test(NSIZE) integer, len :: NSIZE real :: dummy(NSIZE) contains procedure,
我知道这是一个不太可能的事情,但是由于“选项私有(private)模块”的限制,甚至更糟糕的“私有(private)子/函数”的限制,有谁知道是否有一种方法可以从 Excel 应用程序隐藏 VBA 过
我有两个表,property 和 component。 component.id_property = property.id。 我正在尝试创建一个过程,该过程对所选属性的组件进行计数,如果所选属性没
我有一份报告,它是在 SSRS 2005 中开发的,我正在使用存储过程从数据库中获取结果。报告输出的结果非常简单,如下图所示。 如果假设我正在寻找不同的成员 例如:- MemberID c108 c
我需要一个通用函数/过程,该函数/过程将根据提供的数据计算出我的淡入淡出时间和值,如下所示: 我将字节值保存在字节数组中:这些是起始值。然后,我在其他数组中存储了一些值:这些将是新值。然后我有时间要提
我想在界面的多个按钮上创建相同的操作。是否只能通过创建单独的操作监听器方法并调用执行操作的方法才可行,还是还有其他方法?是否可以将按钮放在一个组中并执行以下操作:- groupButton.setOn
我有以下情况: procedure Test; begin repeat TryAgain := FALSE; try // Code // Code if this an
我正在尝试执行以下操作;假设我在 Oracle 中创建了一个对象类型 create type test as object( name varchar2(12), member procedure p
问题: 如果可能的话,如何声明一个用于任何类型参数的函数 T其中 T 的唯一约束是它被定义为 1D array如 type T is array ( integer range <> ) of a_r
我正在尝试创建这个 mysql 过程来制作一个包含今年所有日期和所有时间的表(以一小时为间隔。) CREATE TABLE FECHAS ( created_at datetime ); CREA
所以, 我在这里面临一个问题,这让我发疯,我认为这是一个愚蠢的错误,所以我不是 MySQL 的新手,但它并不像我想象的那样工作。 尝试将此语句部署到 MySQL 后,我收到此错误: ERROR 106
我有一个架构,其中包含星球大战中的人物列表、他们出现的电影、他们访问的行星等。这是架构: CREATE DATABASE IF NOT EXISTS `starwarsFINAL` /*!40100
我一直在为一家慈善机构创建一款应用程序,允许家庭在节日期间注册接收礼物。数据库组织有多个表。下面列出了这些表(及其架构/创建语句): CREATE TABLE IF NOT EXISTS ValidD
正如上面标题所解释的,我正在尝试编写一个sql函数来按日期删除表而不删除系统表。我在此消息下方放置了一张图片,以便直观地解释我的问题。任何帮助将不胜感激!感谢您的时间! 最佳答案 您可以通过查询INF
DELIMITER $$ CREATE PROCEDURE INSERT_NONE_HISTORY_CHECKBOX() BEGIN DECLARE note_id bigint(20); F
是否可以编写一个存储过程或触发器,在特定时间在数据库内部自动执行,而无需来自应用程序的任何调用?如果是,那么任何人都可以给我一个例子或链接到一些我可以阅读如何做到这一点的资源。 最佳答案 查看 pgA
我需要创建一个过程:1)从表中的字段中选择一些文本并将其存储在变量中2) 更新相同的记录字段,仅添加 yyyymmdd 格式的日期以及过程中的附加文本输入...类似这样的... delimiter /
好的,这就是我想做的: 如果条目已存在(例如基于字段name),则只需返回其id 如果没有,请添加 这是我迄今为止所管理的(对于“如果不存在,则创建它”部分): INSERT INTO `object
以下是我编写的程序,用于找出每位客户每天购买的前 10 件商品。 这是我尝试过的第一个 PL/SQL 操作。它没有达到我预期的效果。 我使用的逻辑是接受开始日期、结束日期以及我对每个客户感兴趣的前“x
我正在尝试在MySQL中创建一个过程那insert week s(当年)发送至我的 week table 。但存在一个问题,因为在为下一行添加第一行后,我收到错误: number column can
我是一名优秀的程序员,十分优秀!