Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >iPhone解析xhtml + css

iPhone解析xhtml + css
EN

Stack Overflow用户
提问于 2012-05-29 04:28:24
回答 2查看 876关注 0票数 0

我有一个复杂的长XHTML文件,其中包含CSS。在google和本网站上搜索时,我发现了一些库,它们可以用于XHTML解析:

  • NSXMLParser
  • TBXML
  • 和其他一些

但是,我想知道是否有任何iPhone库可以将xhtml + css文档转换为NSAttributedString (当然只有文本)。

我一直在思考这个问题,我也有一些想法,但我认为它不会很有效率。我的主要想法是通过以下步骤形成的:

  • 在XTHML文件中检测带有idclass属性的所有标记,并获取它们有效的字符串范围(我无法实现这一点)。
  • 将所有CSS属性保存在NSDictionary上,其中包含更多的NSDictionary对象。就像这样: mainDict {对象:字典{对象:@"#00ff00“键:@”颜色“对象:@"1em”键:@“字体大小”}键:@“id”对象: anotherDictionary {.}键:@“另一个id”}}
  • NSAttributedString属性字典上转换这些CSS属性字典。

我知道这很复杂,我不需要你提供代码(当然,如果你提供它,那就太好了),我只想要指向库的链接,或者,如果它不存在,我需要一些建议来自己创建一个解析器。

当然,如果你需要更多的信息,可以通过评论来询问。

谢谢你!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-03 02:36:19

这取决于您的需求是否可以满足您的需要,但是DTCoreText有一个HTML -> NSAttributedString转换器。它对于DTCoreText想要/需要做的事情非常具体,但它至少可以为您指明正确的方向。

票数 2
EN

Stack Overflow用户

发布于 2012-06-04 02:14:58

我将HTML解析为NSAttributedString的方法是将解析的节点(及其childNodes)递归地附加到NSMutableAttributedString中。

我还没有准备好在任何地方发布我的完整代码。但希望这能给你一些提示。

NSString+HTML.h

代码语言:javascript
运行
AI代码解释
复制
/*  - toHTMLElements
 *  parse the string itself into a dictionary collection of htmlelements for following keys
 *  : @"attributedString"   // html main body
 *  : @"insets"         // images and/or videos with range info
 *  : @"as"             // href with range info
 *  
 */

- (NSMutableDictionary*) toHTMLElements;

NSString+HTML.m

代码语言:javascript
运行
AI代码解释
复制
- (NSMutableDictionary*) toHTMLElements {

    // …
    // handle escape encoding here
    // assume that NSString* htmlString is the processed string;
    // …


    NSMutableDictionary * htmlElements = [[NSMutableDictionary dictionary] retain];

    NSMutableAttributedString * attributedString = [[[NSMutableAttributedString alloc] init] autorelease];
    NSMutableArray * insets = [NSMutableArray array];
    NSMutableArray * as     = [NSMutableArray array];

    [htmlElements setObject:attributedString forKey:HTML_ATTRIBUTEDSTRING];
    [htmlElements setObject:insets forKey:HTML_INSETS];
    [htmlElements setObject:as forKey:HTML_AS];


    // parse the HTML with an XML parser
    // CXXML is a variance of TBXML (http://www.tbxml.co.uk/ ) which can handle the inline tags such as <span>
    // code not available to public yet, so write your own inline-tag-enabled HTML/XML parser.

    CXXML * xml = [CXXML tbxmlWithXMLString:htmlString];
    TBXMLElement * root = xml.rootXMLElement;

    TBXMLElement * next = root->firstChild;

    while (next != nil) {
        //
        // do something here for special treatments if needed
        //
        NSString * tagName = [CXXML elementName:next];

        [self appendXMLElement:next withAttributes:[HTMLElementAttributes defaultAttributesFor:tagName] toHTMLElements:htmlElements];

        next = next->nextSibling;
    }

    return [htmlElements autorelease];
}

- (void) appendXMLElement:(TBXMLElement*)aElement withAttributes:(NSDictionary*)parentAttributes toHTMLElements:(NSMutableDictionary*) htmlElements {

    // do your parse of aElement and its attribute values, 
    // assume NSString * tagAttrString is the parsed html attribute string (either from "style" attribute or css file) for this tag like : width:200px; color:#123456; 
    // let an external HTMLElementAttributes class to handle the attribute updates from the parent node's attributes

    NSDictionary * tagAttr = [HTMLElementAttributes updateAttributes: parentAttributes withCSSAttributes:tagAttrString];

    // create your NSAttributedString styled by tagAttr
    // create insets such as images / videos or hyper links objects
    // then update the htmlElements for storage

    // once this tag is handled, recursively visit and process the current tag's children

    TBXMLElement * nextChild = aElement->firstChild;

    while (nextChild != nil) {
        [self appendXMLElement:nextChild withAttributes:tagAttr toHTMLElements:htmlElements];
        nextChild = nextChild->nextSibling;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10799164

复制
相关文章
CUDA 04 - 同步
栅栏同步是一个原语, 在很多并行编程语言中都很常见. 在CUDA中, 同步可以在两个级别执行:
Reck Zhang
2021/08/11
7380
CUDA编程.内核调用
首先我说一下什么叫内核,这里的内核很狭义就是ANSI C关键字+CUDA扩展关键字编写的设备代码~
云深无际
2021/03/12
9380
CUDA编程.内核调用
同步调用与异步调用
同步调用:提交完任务后,就在原地等待任务执行完毕,拿到运行结果/返回值后再执行下一步,同步调用下任务是串行执行。
全栈程序员站长
2022/09/08
1.2K0
聊聊内核的数据同步
内核中同步、交换、回收简要说明 同步、换出、回收三个操作的最小的单位是以页帧为单位,并且和磁盘文件系统操作紧密相关。比如一些针对文件的page缓存进行修改时候在一定时候需要把数据刷到后端的磁盘文件系统,这过程就是同步;进程的堆、栈、匿名映射区通过交换把这些数据换出到交换文件中,这个就是交换(换出),当这些数据再次需要访问时候,就从交换文件中读取加载到内存中;回收操作涉及到物理页的使用问题,比如一个文件的两个dirty page数据flush到磁盘文件系统后,这个2个page回收到buddy系统已备侯勇。 同
用户4700054
2022/08/17
6360
聊聊内核的数据同步
Windows内核原理-同步IO与异步IO
在前段时间检查异常连接导致的内存泄漏排查的过程中,主要涉及到了windows异步I/O相关的知识,看了许多包括重叠I/O、完成端口、IRP、设备驱动程序等Windows下I/O相关的知识,虽然学习到了很多东西,但是仍然需要自顶而下的将所有知识进行梳理。
用户6786055
2019/12/16
1.8K0
linux内核同步机制
关于同步理论的一些基本概念 临界区(critical area): 访问或操作共享数据的代码段 简单理解:synchronized大括号中部分(原子性) 竞争条件(race conditions)两个线程同时拥有临界区的执行权 数据不一致:(data unconsistency) 由竞争条件引起的数据破坏 同步(synchronization)避免race conditions 锁:完成同步的手段(门锁,门后是临界区,只允许一个线程存在) 上锁解锁必须具备原子性 原子性(象原子一样不可分割的操作) 有序
lovelife110
2021/01/14
2K0
Linux内核24-内核同步理解
我们可以把内核想象成一个服务器,专门响应各种请求。这些请求可以是CPU上正在运行的进程发起的请求,也可以是外部的设备发起的中断请求。所以说,内核并不是串行运行,而是交错执行。既然是交错执行,就会产生竞态条件,我们可以采用同步技术消除这种竞态条件。
Tupelo
2022/08/15
1.1K0
Linux内核37-内核数据的同步访问
每一种技术的出现必然是因为某种需求。正因为人的本性是贪婪的,所以科技的创新才能日新月异。
Tupelo
2022/08/15
9300
DAY40:阅读Memory Fence Functions
The CUDA programming model assumes a device with a weakly-ordered memory model, that is the order in which a CUDA thread writes data to shared memory, global memory, page-locked host memory, or the memory of a peer device is not necessarily the order in which the data is observed being written by another CUDA or host thread.
GPUS Lady
2018/08/01
7710
DAY40:阅读Memory Fence Functions
DAY11:阅读CUDA异步并发执行中的Event和同步调用
今天内容比较简单,讲解Events和同步调用。自此,关于异步并发执行部分的1.主机与GPU之间的并发执行;2.内核并发执行;3.数据传输和内核执行之间的重叠;4.并行数据传输;5.Stream;6.Event;7.同步调用 就全部讲完。 3.2.5.6. Events【事件】 The runtime also provides a way to closely monitor the device's progress, as well as perform accurate timing, by le
GPUS Lady
2018/06/22
2.8K1
Linux内核38-内核同步实际例子
要想一个系统不崩溃,性能还得好,同步技术是非常关键的。但是,完全避免竞态条件几乎是难于上青天。因为它要求对内核各个功能模块之间的交互得有一个清晰深刻的理解。下面我们看一下Linux内核中一些具体保护数据访问的示例,加深对其理解,甚至可以在自己的内核设计上借鉴一下。
Tupelo
2022/08/15
6580
同步调用和异步调用
对于同步与异步来说,好多人与我在初学的时候一样,肯定是一脸蒙x。不过没关系,慢慢来,我将我见到和理解的和大家分享一下,希望对大家有所帮助。
小闫同学啊
2019/07/18
1.5K0
linux 内核同步机制使用
Linux 内核中的同步机制:原子操作、信号量、读写信号量、自旋锁的API、大内核锁、读写锁、大读者锁、RCU和顺序锁。 1、介绍 在现代操作系统里,同一时间可能有多个内核执行流在执行,即使单CPU内核也需要一些同步机制来同步不同执行单元对共享的数据的访问。 主流的Linux内核中的同步机制包括: 原子操作 信号量(semaphore) 读写信号量(rw_semaphore) 自旋锁spinlock 大内核锁BKL(Big Kernel Lock) 读写锁rwlock、 brlock(只包含在2.4内核中
李海彬
2018/03/22
2.4K0
Java中的线程同步与同步器
# [AI文本 OCR识别最佳实践](https://cloud.tencent.com/developer/article/2304343)
疯狂的KK
2023/08/14
2770
Java中的线程同步与同步器
android账号与同步之同步实现
上一篇博文我先介绍了账号与同步的账号管理,这篇就介绍一下还有一部分。就是android给提供的sync同步机制的使用。 事实上sync机制的使用和上一篇博文中介绍的账号管理非常类似,也是基于binder机制的跨进程通信。首先它须要一个Service。这个服务提供一个Action给系统以便系统能找到它。然后就是继承和实现AbstractThreadedSyncAdapter。此类中包括实现了ISyncAdapter.Stub内部类。这个内部类封装了远程接口调用,这个类getSyncAdapterBinder()方法,返回内部类的IBinder形式,以便对AbstractThreadedSyncAdapte进行远程调用;在manifest中须要对Service注冊,并且指定meta-data。这个meta-data是一个xml文件,在SampleSyncAdapter实例中,它的名字是syncadapter.xml,这个文件指定了账号和被监听的contentprovider。
全栈程序员站长
2022/07/10
1.3K0
Linux内核36-内核同步之禁止中断
每一种技术的出现必然是因为某种需求。正因为人的本性是贪婪的,所以科技的创新才能日新月异。
Tupelo
2022/08/15
1.5K0
同步与异步
一、同步与异步的概念 前言 python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病。然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率 同步 指完成事务的逻辑,先执行第一个事务,如果阻塞了,会一直等待,直到这个事务完成,再执行第二个事务,顺序执行 异步 是和同步相对的,异步是指在处理调用这个事务的之后,不会等待这个事务的处理结果,直接处理第二个事务去了,通过状态、通知、回调来通知调用者处理结果 说明 假设用户访问一个网站并得到响应的时间
星哥玩云
2022/09/08
9710
同步与异步
blob转string,同步调用
前端接口请求的时候,设置responseType: 'blob',后端接口直接返回的是文件流。
甜点cc
2023/10/16
2520
linux内核级同步机制--futex
在面试中关于多线程同步,你必须要思考的问题 一文中,我们知道glibc的pthread_cond_timedwait底层是用linux futex机制实现的。
李红
2019/07/29
3.3K0
Linux内核同步机制之completion
Linux内核同步机制之completion 内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束。这个活动可能是,创建一个新的内核线程或者新的用户空间进程、对一个已有进程的某个请求,或者某种类型的硬件动作,等等。在这种情况下,我们可以使用信号量来同步这两个任务。然而,内核中提供了另外一种机制——completion接口。Completion是一种轻量级的机制,他允许一个线程告诉另一个线程某个工作已经完成。 结构与初始化 Completion在内核中的实现基于等待队列(关于等待队
233333
2018/07/03
4.2K0

相似问题

Keras输入形状误差

10

输入形状Keras问题

20

请用Keras解释输入形状。

10

返回错误的Keras输入形状

20

输入形状卷积神经网络的误差

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文