2016-11-04 13 views
0

私はJavaScriptを作成するためにTypeScriptを使用しています。関数は、キーと値を含むXML文字列を返す必要があります。値は関数のパラメータから得られます。私はそれが安全に行われることを望みます。たとえば、Terms & ConditionsTerms & Conditionsにエンコーディングする必要があります。 I have seen the DOMParser is recommended for processing XMLルートノードなしでXML文字列を作成する方法は?

My機能は、現在、次のようになります。呼び出されたとき

createDocumentXml(base64Document: string, category: string, documentName: string, documentExtension: string, userId: number, documentSizeBytes: number): string { 
    let xmlTemplate = 
     '<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' + 
      '<active>true</active>' + 
      '<category></category>' + 
      '<content></content>' + 
      '<createdByID></createdByID>' + 
      '<createdDate xsi:nil="true"/>' + 
      '<description></description>' + 
      '<fileExtension></fileExtension>' + 
      '<name></name>' + 
      '<size></size>' + 
     '</document>' 

    // use a DOM parser to modify the XML safely (i.e. escape any reserved characters) 
    let parser = new DOMParser(); 
    let xmlDocument = parser.parseFromString(xmlTemplate, 'text/xml'); 

    xmlDocument.getElementsByTagName('category')[0].textContent = category; 
    xmlDocument.getElementsByTagName('content')[0].textContent = base64Document; 
    xmlDocument.getElementsByTagName('createdByID')[0].textContent = userId.toString(); 
    xmlDocument.getElementsByTagName('description')[0].textContent = documentName; 
    xmlDocument.getElementsByTagName('fileExtension')[0].textContent = documentExtension; 
    xmlDocument.getElementsByTagName('name')[0].textContent = documentName; 
    xmlDocument.getElementsByTagName('size')[0].textContent = documentSizeBytes.toString(); 

    let serializer = new XMLSerializer(); 
    return serializer.serializeToString(xmlDocument); 
} 

、それはこのような文字列を返します:

私はそれだけでなくて、内側XML要素を返すために取得できますか
<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <active>true</active> 
    <category>Correspondence\Emails</category> 
    <content>ZmlzaCAmIGNoaXBzIQ==</content> 
    <createdByID>6627774</createdByID> 
    <createdDate xsi:nil="true"/> 
    <description>Terms &amp; Conditions</description> 
    <fileExtension>docx</fileExtension> 
    <name>Terms &amp; Conditions</name> 
    <size>12345</size> 
</document> 

documentルート?

<active>true</active> 
<category>Correspondence\Emails</category> 
<content>ZmlzaCAmIGNoaXBzIQ==</content> 
<createdByID>6627774</createdByID> 
<createdDate xsi:nil="true"/> 
<description>Terms &amp; Conditions</description> 
<fileExtension>docx</fileExtension> 
<name>Terms &amp; Conditions</name> 
<size>12345</size> 

私はxmlTemplateからルートを省略しようとしたが、DOMParser.parseFromStringは1が必要です。

この関数の結果は格納され、その後、関連する場所に完全なXMLデータ(ルートノードを含む)を挿入する別の関数に渡されます。むしろ、あなたの現在のリターンよりも

+3

xml標準ではルートノードが必要です。文書に1つがなければ、それは有効なxmlではありません。とにかくそれを省略したいのですが? –

+0

ps、これはエンコーディングと呼ばれ、エスケープしません。 –

+0

ルートノードなしでXMLを必要としません。この要求は意味をなさない。 (言い換えれば、あなたがそれを必要と思う理由を教えてください) – Tomalak

答えて

0

、あなたがかもしれない:(X)HTMLは、実際に有効なXMLであるので

return Array 
    .from(xmlDocument.children[0].children) 
    .map(function(node) { return serializer.serializeToString(node); }) 
    .join(""); 
0

することは、あなたがそれらの上に、通常のDOM関数を使用することができます。

let serializer = new XMLSerializer(); 
var str = serializer.serializeToString(xmlDocument); 

var div = document.createElement("div"); 
div.innerHTML = str; 
var inner = div.getElementsByTagName('document')[0].innerHTML; 
return inner; 

https://jsfiddle.net/qchbuo7c/

しかし、Tomolakはそれだけですべての可能で、一度にすべての場合、全体のドキュメントを作成する方がよいwoulld、権利です。

+0

* "HTMLは実際にはXMLのサブセットです" * - それはまったく間違っています。 HTMLにはXMLで利用できない多くの機能があります。それらはAPIとマークアップ言語の基本概念を共有しますが、それらは互いにサブセットではありません。 – Tomalak

+0

@Tomalak - タイプミス、私の間違い。それを固定した。 –

+0

XHTMLの場合、ステートメントはtrueです。ただし、この時点では、専用のXML機能(DOMParser、XMLDocument)を使用する方が理にかなっています。また、OPの質問自体が誤ってターゲットにされています。彼らは最初にこの特定の方法でこの問題を解決すべきではありません。 – Tomalak

関連する問題