Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >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

复制
相关文章
selenium2java 遇到有三个窗口用例的处理办法
本人在学习selenium2java的时候遇到一个用例,执行完竟然有三个窗口,使用handles的办法教程只写了两个窗口的解决办法,后来我把handles全都输出出来后发现其实相当于三个窗口,再进去第三个窗口的时候,多判断一下就好了,斜面分享一下自己的经验。
FunTester
2019/08/31
4250
[答疑]时间作为执行者的用例有前置条件吗
潘老师,想问下时间作为执行者会有前置条件吗?时间是自然流逝,到点执行,我个人觉得是没有前置条件的。举个例子,微信支付的退款,1直连商户系统-受理退款。2时间-处理退款,我们目前写了前置条件,这样对吗
用户6288414
2019/09/23
7430
[答疑]时间作为执行者的用例有前置条件吗
边缘计算有哪些用例?
从本质上讲,边缘计算使云平台或数据中心尽可能靠近用户或设备,从而缩短了响应时间。边缘计算在多个行业都有应用,其中包括医疗保健、制造和零售行业等。
静一
2022/12/08
7270
线程安全是否有什么办法检测到呢?
答案就是 data race tag,go 官方早在 1.1 版本就引入了数据竞争的检测工具,我们只需要在执行测试或者是编译的时候加上 -race 的 flag 就可以开启数据竞争的检测
用户7365393
2021/10/06
4920
用mysql查询某字段是否有索引
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/113450.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/07
4.6K0
用mysql查询某字段是否有索引
Pytest(十三)durations统计用例运行时间
写完一个项目的自动化用例之后,发现有些用例运行较慢,影响整体的用例运行速度,我们需要排除一下问题,那么应该如何去做呢
雷子
2022/04/06
1.1K0
Pytest(十三)durations统计用例运行时间
Pytest(二十二)利用allure增加对用例步骤等描述
增加附加信息在上一次分享的时候已经讲解,这次呢,只说前面的5个,看下具体可以怎么用
雷子
2022/05/21
8040
Pytest(二十二)利用allure增加对用例步骤等描述
thymeleaf js增加时间戳
1、使用 @{/bootstrap/css/signin.css(v=${version})}
用户9131103
2023/07/17
7710
linux history 增加时间戳
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/158623.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/14
4.3K0
[答疑]在A业务用例下,有5个业务流程;在B业务用例下,有7个业务流程
第五元素(50***16) 9:08:47 经过仔细思考,原来的老问题还是没有想通。请潘老师指教: 1、在A业务用例下,有5个业务流程;在B业务用例下,有7个业务流程。其中,有4个业务流程是完全相同的。 请问,这四个相同的业务流程,是否可以归纳为"包含"(include)的业务用例?需要在业务用例图中表达出来吗? 2、一个业务用例对应多个业务流程,最后用交互概览图来总括表达。那么同一个业务用例划分为多个业务流程的原则是什么? 比如,A业务用例划分为A1、A2....等业务流程,用交互概览图"串"起来。那么在
用户6288414
2021/10/13
5860
java单例模式有什么用_java单例模式代码实现
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169701.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
2930
【说站】php单例模式有什么用
2、单例模式是指只创建一个资源(对象、数据库链接等),防止外部实例+判断是否有返回或创建后返回对象。
很酷的站长
2022/11/24
7880
【说站】php单例模式有什么用
用例图详解_用例图include是用什么画的
  对于用例图来说我们需要了解的是什么叫用例图,构成用例图的要素,用例图有哪些重要的元素,各个用例之间的关系。当然最重要的是如何根据需求创建用例图。具体的创建通过一个简单的学生管理的例子说明创建的过程和例子。   我的所有例子都是是使用Rose这个软件来画的,现在虽然有新的UML模型画图软件,但是我比较喜欢用这个Rose,如果你还没有装这个软件需要先装一个,或者使用你比较喜欢的UML画图软件。下面我们直接进入正题吧,学习一下用例图的相关概念和具体的创建过程。
全栈程序员站长
2022/10/04
2.3K0
用例图详解_用例图include是用什么画的
用linux有一段时间后
6、vim程序编辑器里上下左右,多行多个字符;向下/上一页;到该列最前/后面;到第一/最后列;向下移动10列;向下/上查找;同方向/反方向相符字串;[del]按键[backspace按键];删除整一列;删除20列;复制整一列;复制20列;粘贴于游标上一列/下一列;撤销;重做上一个动作/重做前一个动作;另存为;显示行号/取消行号/光标移动到第20列;
可定
2020/04/20
1.7K0
UML用例图及其用例描述
UML(统一建模语言,Unified Modeling Language)是一种定义良好、易于表达、功能强大且普遍适用的可视化建模语言。它融入了软件工程领域的新思想、新方法和新技术。它的作用域不限于支 持面向对象的分析与设计,还支持从需求分析开始的软件开发的全过程。在系统分析阶段,我们一般用UML来画很多图,主要包括用例图、状态图、类图、活动 图、序列图、协作图、构建图、配置图等等,要画哪些图要根据具体情况而定。其实简单的理解,也是个人的理解,UML的作用就是用很多图从静态和动态方面来 全面描述我们将要开发的系统。
麦克劳林
2019/04/22
2K0
UML用例图及其用例描述
判断是否有重复的数字
import java.util.Scanner; import java.util.HashMap; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int m=input.nextInt(); HashMap map=new HashMap(); while(m-->0) { int tmp=input.nextInt(); if(
葆宁
2019/04/18
3.6K0
判断是否有重复的数字
staruml画用例图连线_画用例图的例题
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/03
2.2K0
staruml画用例图连线_画用例图的例题
用python 判断一个单链表是否有环.
https://leetcode.com/problems/linked-list-cycle/
py3study
2020/01/06
1.3K0
用例图示例:包含和扩展用例
用例提供了系统的高级视图。用例建模是与用户和其他利益相关者就系统和目标进行沟通的有效方式。用例描述了系统执行的动作序列,其为特定的actor产生可观察的值结果。它支持需求工程活动和捕获系统应该执行的需求过程,主要是系统功能需求。用例捕获用户和系统可以交互的所有可能方式,从而实现用户实现目标。它们还捕获了阻止用户实现目标的所有可能出错的事情。
Warren2Lynch
2018/07/04
2.7K0
用例图示例:包含和扩展用例
点击加载更多

相似问题

是否有办法增加特定服务的windows服务启动超时时间?

10

Ocaml中是否有单例变体的用例?

427

是否有办法增加/更改aws quicksight嵌入式URL的过期时间?

119

有没有办法用javascript来增加时间?

40

是否有折叠()函数的特定用例?

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档