Skip to main content

Formatting XML from XML String trouble with removing indent after XML-Tag closed

I have the following function, which takes a two xml strings as input and then compares them and creates a html output showing the differences marked in red.

function compareXml(xml1, xml2) {
    xml1 = formatXml(xml1);
    xml2 = formatXml(xml2);
    let html = "<table>";
    let lineNo = 0;
    let xml1Nodes = xml1.split("\n");
    let xml2Nodes = xml2.split("\n");

    for (let i = 0; i < Math.max(xml1Nodes.length, xml2Nodes.length); i++) {
        lineNo++;
        let xml1Line = xml1Nodes[i];
        let xml2Line = xml2Nodes[i];
        let xml1Node = xml1Line.replace(/</g, "&lt;").replace(/>/g, "&gt;");
        let xml2Node = xml2Line.replace(/</g, "&lt;").replace(/>/g, "&gt;");
        if (xml1Line !== xml2Line) {
            html += "<tr><td class='xml1' style='background-color:red'>" + "Zeile: " + lineNo + " " + xml1Node + "</td><td class='xml2' style='background-color:red'>" + "Zeile: " + lineNo + " " + xml2Node + "</td></tr>";
        } else {
            html += "<tr><td class='xml1'>" + "Zeile: " + lineNo + " " + xml1Node + "</td><td  class='xml2'>" + "Zeile: " + lineNo + " " + xml2Node + "</td></tr>";
        }
    }

    html += "</table>";
    return html;
}

the following function is called to format the xml correcly (indentation) but the problem is that the indentation won't get removed, when the xml tag gets closed.

function formatXml(xml) {
    let formatted = "";
    let indent = "";

    let nodes = xml.match(/(<[^\/][^>]*>|<\/[^>]+>|[^<]+)/g);

    nodes.forEach(function(node) {
        if (node.startsWith("<")) {
            formatted += indent + node;
            if (!node.endsWith("/>")) {
                if (nodes.length > nodes.indexOf(node) + 1 && nodes[nodes.indexOf(node) + 1].startsWith("<")) {
                    formatted += "\n";
                    indent += "&nbsp;&nbsp;";
                }
            }
        } else if (node.startsWith("</")) {
            indent = indent.substring(6);
            formatted += indent + node + "\n";
        } else {
            formatted += node;
        }
    });

    return formatted;
}

The return value of the compareXml Function then gets put into a IFrame where it should display the XML correctly formatted. I'm glad for any answers or inputs to point me in the right direction since JS is not my area :)

Thanks already!

I get the following output when printing it to the console:

<?xmlversion="1.0"encoding="utf-16"?>
&nbsp;&nbsp;<testxml>
&nbsp;&nbsp;&nbsp;&nbsp;<xml>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<title>TestXml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</title>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</xml>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</testxml>

as you can see, the indentation won't get removed and only gets added further. I tried a lot of things by tweaking my code but I'm somehow not able to figure it out.

Via Active questions tagged javascript - Stack Overflow https://ift.tt/qpuJKsz

Comments

Popular posts from this blog

Why is my reports service not connecting?

I am trying to pull some data from a Postgres database using Node.js and node-postures but I can't figure out why my service isn't connecting. my routes/index.js file: const express = require('express'); const router = express.Router(); const ordersCountController = require('../controllers/ordersCountController'); const ordersController = require('../controllers/ordersController'); const weeklyReportsController = require('../controllers/weeklyReportsController'); router.get('/orders_count', ordersCountController); router.get('/orders', ordersController); router.get('/weekly_reports', weeklyReportsController); module.exports = router; My controllers/weeklyReportsController.js file: const weeklyReportsService = require('../services/weeklyReportsService'); const weeklyReportsController = async (req, res) => { try { const data = await weeklyReportsService; res.json({data}) console...

How to show number of registered users in Laravel based on usertype?

i'm trying to display data from the database in the admin dashboard i used this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count(); echo $users; ?> and i have successfully get the correct data from the database but what if i want to display a specific data for example in this user table there is "usertype" that specify if the user is normal user or admin i want to user the same code above but to display a specific usertype i tried this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count()->WHERE usertype =admin; echo $users; ?> but it didn't work, what am i doing wrong? source https://stackoverflow.com/questions/68199726/how-to-show-number-of-registered-users-in-laravel-based-on-usertype

The number of nodes and edges I calculated manually and by a method provided by networkx library dont match

I am trying to analyse a graph using networkx library in Python. I have implemented a function that returns the nodes and edges of that graph. After that I counted the number of nodes and edges by implementing the len() function for nodes and edges, which gave me 17 for both nodes and edges. However, when I used the method graph.number_of_nodes() of networkx library it gave me 53. My code: import pandas as pd import networkx as nx import matplotlib.pyplot as plt header_list = ["a","b","w"] E =pd.read_csv("aves-barn-swallow-contact-network.edges",sep=" ",header= None,names=header_list) # print(E.head()) # prints first few rows of the csv file G = nx.from_pandas_edgelist(E,"a","b",["w"]) nx.draw(G) plt.show() class GraphAnalyse: #finding nodes and edges def nodeEdge(self,Graph): nodes = Graph.nodes() edges = Graph.edges() ...