Как удалить вставленный комментарий OOXML, используя Word JS API?

1

Я пытаюсь вставить комментарии внутри документа insertOoxml используя метод insertOoxml. Комментарий успешно вставлен.

Я хочу удалить этот добавленный вручную комментарий на основе одного из действий пользователя. Например, когда они переключаются с одной функции моей надстройки на другую. Я пытаюсь удалить части комментария из строки 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 ошибку GeneralException. Я думаю, что я искажаю объект XML где-то, поэтому просто хотел подтвердить

а. Это правильный подход/обходной путь к моей проблеме?
б. Что мне не хватает для замены здесь?
с. Есть ли еще какое-то другое сложное решение?

Теги:
ms-word
office-js
openxml

1 ответ

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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню