2017-06-28 2 views
1

insertOoxmlメソッドを使用して、ワードドキュメント内にコメントを挿入しようとしています。コメントは正常に挿入されます。Word JS APIを使用して挿入されたOOXMLコメントを削除するにはどうすればよいですか?

この手動で挿入されたコメントは、ユーザーの操作の1つに基づいて削除します。たとえば、アドインの機能を別の機能に切り替える場合などです。私は正規表現の一致を使用してOoxml文字列からコメント部分を削除しようとしており、これを機能させるために置き換えます。

Word.run(async(context) => { 
    let body = context.document.body 
    let bodyOOXML = body.getOoxml() 
    await context.sync() 
    let bodyOOXMLText = bodyOOXML.value 

    bodyOOXMLText = bodyOOXMLText.replace(/<relationship(.*?)target="comments.xml(.*?)comments">/g, '') 
    bodyOOXMLText = bodyOOXMLText.replace(/<w:commentRangeStart(.*?)w:commentRangeEnd(.*?)\/>/g, '') 
    bodyOOXMLText = bodyOOXMLText.replace(/<w:comments(.*?)w:comments>/g, '') 
    bodyOOXMLText = bodyOOXMLText.replace(/<pkg:part(.*?)comments\+xml(.*?)word\/comments\.xml">(.*?)<\/pkg:part>/g, '') 

    body.insertOoxml(bodyOOXMLText, Word.InsertLocation.replace) 
    await context.sync() 

}) 

これはエラーGeneralExceptionをスローします。私はどこかでXMLオブジェクトを破損していると思うので、確認したいだけです。

a。これは私の問題の正しいアプローチ/回避策ですか?
b。私はここに置き換えるために何が欠けていますか?
c。他に洗練されたソリューションがありますか?

答えて

0

regexメソッドは安全ではありません。このアプローチはまだ同じです。 XMLパーサーを使用して、XML DOMツリーから関連するノードを削除します。

コードサンプル:

export function removeCommentsFromXML(xmlString){ 
    let xmlText = '' 
    try{ 

    // initialize DOM parser 
    let parser = new DOMParser() 
    let namespace = [] 

    // parse XML string into XML DOM object 
    let xmlDoc = parser.parseFromString(xmlString, 'text/xml') 

    // get xml namespace prefix for 'pkg' 
    namespace['pkg'] = xmlDoc.documentElement.getAttribute('xmlns:pkg') 

    // get all 'pkg:part' nodes 
    let allChildrenNodes = xmlDoc.getElementsByTagNameNS(namespace['pkg'], 'part') 

    // delete comments.xml node in pkg:part 
    let currentChildNode = allChildrenNodes[0] 
    while (currentChildNode!==null && currentChildNode.getAttribute('pkg:name').match('comments.xml')===null) { 
     currentChildNode = currentChildNode.nextSibling 
    } 
    if(currentChildNode!==null) currentChildNode.parentNode.removeChild(currentChildNode) 

    // get document relationship package 
    currentChildNode = allChildrenNodes[0] 
    while (currentChildNode!==null && currentChildNode.getAttribute('pkg:name').match('word/_rels')===null) { 
     currentChildNode = currentChildNode.nextSibling 
    } 

    // get all relationships 
    let relationships = currentChildNode.getElementsByTagName('Relationship') 

    // delete comment relationship from relationships 
    let currentRelationship = relationships[0] 
    while (currentRelationship!==null && currentRelationship.getAttribute('Target').match('comments.xml')===null) { 
     currentRelationship = currentRelationship.nextSibling 
    } 
    if(currentRelationship!==null) currentRelationship.parentNode.removeChild(currentRelationship) 

    // get main document 
    currentChildNode = allChildrenNodes[0] 
    while (currentChildNode!==null && currentChildNode.getAttribute('pkg:name').match('/word/document.xml')===null) { 
     currentChildNode = currentChildNode.nextSibling 
    } 

    // get w namespace 
    namespace['w'] = currentChildNode.childNodes[0].childNodes[0].getAttribute('xmlns:w') 

    // get commentRangeStart nodes 
    let commentRangeStartNodes = currentChildNode.getElementsByTagNameNS(namespace['w'], 'commentRangeStart') 
    while(commentRangeStartNodes.length>0) { 
     commentRangeStartNodes[0].parentNode.removeChild(commentRangeStartNodes[0]) 
    } 

    // get commentReference nodes 
    let commentReferenceNodes = currentChildNode.getElementsByTagNameNS(namespace['w'], 'commentReference') 
    while(commentReferenceNodes.length>0) { 
     commentReferenceNodes[0].parentNode.removeChild(commentReferenceNodes[0]) 
    } 

    // get commentRangeEnd nodes 
    let commentRangeEndNodes = currentChildNode.getElementsByTagNameNS(namespace['w'], 'commentRangeEnd') 
    while(commentRangeEndNodes.length>0) { 
     commentRangeEndNodes[0].parentNode.removeChild(commentRangeEndNodes[0]) 
    } 

    xmlText = new XMLSerializer().serializeToString(xmlDoc) 
    } 
    catch(err){ 
    console.log(err) 
    } 

    return xmlText 
} 

変更されたXML文字列は、現在使用して挿入することができます
body.insertOoxml(xmlText, Word.InsertLocation.replace)

関連する問題