0

CSSを含む複雑な長いXHTMLファイルがあります。グーグルとこのサイトで検索すると、XHTML解析に役立つライブラリがいくつか見つかりました。

  • NSXMLParser
  • TBXML
  • そして他の何人か

NSAttributedStringただし、xhtml + cssドキュメントを(もちろんテキストのみ)に 変換できるiPhone用のライブラリがあるかどうか疑問に思っています。

私はその問題について考えていて、いくつかのアイデアがありましたが、それはあまり効率的ではないと思います。私の主なアイデアは、次の手順で形成されます。

  • XTHMLファイルでidorclass属性を持つすべてのタグを検出し、それらが有効な文字列の範囲を取得します(これは達成できません)。
  • すべてのCSS属性をに保存し、NSDictionaryさらに多くのNSDictionaryオブジェクトを内部に保存します。このようなもの:

    mainDict {
        object: dictionary {
             object: @"#00ff00"
             key: @"color"
             object: @"1em"
             key: @"font-size"
        }
        key: @"a id"
        object: anotherDictionary {
            ...
        }
        key: @"another id"
    }
    
  • これらのCSS属性ディクショナリを属性ディクショナリに変換しNSAttributedStringます。

これは複雑であり、コードを提供する必要はありません(もちろん、提供する場合は素晴らしいでしょう)。ライブラリへのリンクのみが必要です。存在しない場合は、自分でパーサーを作成するためのアドバイス。

もちろん、さらに情報が必要な場合は、コメントで質問してください。

ありがとうございます!!

4

2 に答える 2

2

これがあなたの望むことをするかどうかはあなたのニーズに依存しますが、DTCoreTextにはHTML->NSAttributedStringコンバーターがあります。DTCoreTextが何をしたいのか、何をする必要があるのか​​は非常に具体的ですが、少なくとも正しい方向を示している可能性があります。

于 2012-06-03T10:36:19.853 に答える
1

HTML文字列をNSAttributedStringに解析する私の方法は、解析されたノード(およびそのchildNodes)をNSMutableAttributedStringに再帰的に追加することです。

まだ完全なコードをどこにも公開する準備ができていません。しかし、うまくいけば、これはあなたにいくつかのヒントを与えることができます...

NSString + HTML.h

/*  - 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

- (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;
    }
}
于 2012-06-04T10:14:58.873 に答える