XML formatting regex merge lines and keep indentation - regex

I've got xml files that I want to apply universal formatting to using regex.
Basically what I want is to have these 2 lines on 1 line.
]]>
</query>
AND
have it with the same indentation as the opening tag.
So this example (or any variation to it)
<search>
<query><![CDATA[
testline1
]]>
</query>
</search>
Should become this
<search>
<query><![CDATA[
testline1
]]></query>
</search>
See my example here on regex101.com

This is how you would do it with python:
from lxml import etree
test = """your xml above"""
doc = etree.XML(test)
target = doc.xpath('//query')[0]
target.text = etree.CDATA("".join(target.text.rsplit('\n',1)))
print(etree.tostring(doc).decode())
Output:
<search>
<query><![CDATA[
testline1
]]></query>
</search>

Related

Getting error in ANT regex "Couldn't rename temporary file C:\Users\username\AppData\Local\Temp\replace7877977241325466040.txt"

In ANT, I am trying to replace a file's property using regex by using the below script:
<property file="MyFilePath/MyFileName1.properties" />
<replaceregexp file="MyFilePath/MyFileName2.properties"
match="#{ComparingProperties}=(.*)"
replace="#{ComparingProperties}=${#{ComparingProperties}}" />
Read a content from MyFileName1 and replacing the property in MyFileName2.
While execution I am facing issue as "Couldn't rename temporary file C:\Users\username\AppData\Local\Temp\replace7877977241325466040.txt"
If I remove this regex and try, the build goes fine. In many of my scripts I used replaceregex, but this is the place I get this error newly. Any inputs would be really helpful. Thanks !

Is outputMode Still Supported In alchemy_language.entities

I have this inherited code which in Python 2.7 successfully returns results in xml that are then parsed by ElementTree.
result = alchemyObj.TextGetRankedNamedEntities(text)
root = ET.fromstring(result)
I am updating program to Python 3.5 and am attempting to do this so that I don't need to modify xml parsing of results:
result = alchemy_language.entities(outputMode='xml', text='text', max_
items='10'),
root = ET.fromstring(result)
Per http://www.ibm.com/watson/developercloud/alchemy-language/api/v1/#entities outputMode allows the choice between json default and xml. However, I get this error:
Traceback (most recent call last):
File "bin/nerv35.py", line 93, in <module>
main()
File "bin/nerv35.py", line 55, in main
result = alchemy_language.entities(outputMode='xml', text='text', max_items='10'),
TypeError: entities() got an unexpected keyword argument 'outputMode'
Does outputMode actually still exist? If so, what is wrong with the entities parameters?
The watson-developer-cloud does not appear to have this option for Entities. The settings allowed are:
html
text
url
disambiguate
linked_data
coreference
quotations
sentiment
show_source_text
max_items
language
model
You can try accessing the API directly by using requests. For example:
import requests
alchemyApiKey = 'YOUR_API_KEY'
url = 'https://gateway-a.watsonplatform.net/calls/text/TextGetRankedNamedEntities'
payload = { 'apikey': alchemyApiKey,
'outputMode': 'xml',
'text': 'This is an example text. IBM Corp'
}
r = requests.post(url,payload)
print r.text
Should return this:
<?xml version="1.0" encoding="UTF-8"?>
<results>
<status>OK</status>
<usage>By accessing AlchemyAPI or using information generated by AlchemyAPI, you are agreeing to be bound by the AlchemyAPI Terms of Use: http://www.alchemyapi.com/company/terms.html</usage>
<url></url>
<language>english</language>
<entities>
<entity>
<type>Company</type>
<relevance>0.961433</relevance>
<count>1</count>
<text>IBM Corp</text>
</entity>
</entities>
</results>

How do I link a local disk location URL to a tag in XML?

I am pretty new to XML and XML with Python. I am using LXML module for this. My objective is to do something like:
<include>
<!--This is the result--> #This is for naming the result of the file .
<check run = "1000">
<params>
<param name="Name" path="$${path_to_the_file_in_local_disk}"/>
</params>
<True>
<variable name="File1" path=""/>
<variable name="File2" path="c:\xyz"/>
<variable name="File3" path="c:\xyz"/>
<variable name="File4" path="c:\xyz"/>
<variable name="File5" path="c:\xyz"/>
<variable name="File6" path="c:\xyz"/>
<variable name="File7" path="c:\xyz"/>
<variable name="File8" path="c:\xyz"/>
</variables>
</user>
</include>
And this i want to generate dynamically. Say, i have some 10 files and based on certain search criteria, i need to Classify the files. Lets say, classification is True and False.
So, under True section, i have some 4 files. I want to make an entry in the XML with their respective file location on the local disk. When i open the XML file in browser, the link in the XML file can open up the directory for me.
So my Questions are:
1. How do i create a XML tag each time a condition is met?
2. How do i link it to the local disk location?
Till far, i have done the Console printing of the result.
f = open('./script.log', 'r')
for lines in f.readlines():
passed = lines.find("=== Result: PASS ===")
failed = lines.find("=== Result: FAIL ===")
if passed != -1:
print "True File"
passed_cnt = passed_cnt + 1
passed_list.append(os.getcwd())
lookup = '* COMMAND:'
with open('./script.log') as myFile:
for num, line in enumerate(myFile, 1):
if lookup in line:
#print 'found at line:', num
tc_id = (line.split('\\')[-1]).split(' ')[-3]
print "TRUE FILE Name : ", tc_id
variable = etree.SubElement(variables, "variable")
variable.set('name', 'path')
variable.set('value', '1000')
To answer the question in the title:
with open("outfile.xml", "wb") as outfile:
outfile.write(etree.tostring(xmlroot, xml_declaration=True))
To answer the question in the post:
You link to a local file with a file: url. I'm unsure how they should look exactly on Windows, but I think it's like this:
file://c\:\\<path to the file>
Look for examples and experiment.
I found a way to deal with the problem here. My issues were:
1. Generating a XML file.
2. This file was to be be compiled dynamically for each and every run.
I did something like:
from __future__ import division
import os
import fnmatch
import xml.etree.cElementTree as ET
import time
import csv
from xml.etree.ElementTree import Element, SubElement, Comment, tostring
import datetime
from lxml import etree
import smtplib
root = etree.Element("include")
comment1 = etree.Comment("================<Your Text>================")
root.append(comment1)
user1 = etree.SubElement(root, "Complete_Results")
param = etree.SubElement(user1, "Total")
param.set('Success_Percentage', str('%.2f'%((passed_cnt/total_Count)*100)))
param = etree.SubElement(user1, "Total")
param.set('Failure_Percentage', str('%.2f'%((failed_cnt/total_Count)*100)))
param = etree.SubElement(user1, "Aggregate_Result")
if pass_percentage == 100:
res = "_________________Successfully_Passed________________"
else:
res = "________________Iteration_Failed________________"
param.set('Finally', res)
user1 = etree.SubElement(root, "Success_Results")
comment2 = etree.Comment("======================= Passed test cases section ==========================")
user1.append(comment2)
user1.set('Number_of_Test_cases_passed', str(passed_cnt))
params = etree.SubElement(user1, "Results")
param = etree.SubElement(params, "Success_Results")
for i in passed_TC_list:
for location in passed_list:
param = etree.SubElement(params, 'TC_Details')
param.set('File_name', str(i))
param = etree.SubElement(params, 'ID' )
param.set('Path_in_Local_Directory',str(location))
path = str(str(location) + str("\\") + str(i))
param.set('Link_to_file', str(path))
passed_list.remove(location)

Use text file to provide input for etree xml

I have a xml file and I need to change 2 parameters in this xml file from the etee.
XML file:
<?xml version="1.0"?>
<ABC_Input xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<REQ>
<!-- Optional in XSD -->
<INFO>ALL</INFO>
</REQ>
<PO>
<PO_ID>3557698</PO_ID>
<!-- Req in XSD -->
<RAN>HQF011512C</RAN>
<!-- Req in XSD -->
</PO>
</ABC_Input>
I have written below code to achieve this
import xml.etree.ElementTree as ET
tree = ET.parse('alpha.xml')
root = tree.getroot()
for val in root.findall('PO')
val.find('RAN').text="HQ123"
tree.write('output1.xml')
Now I need to pass value of RAN & PO_ID from text file as input then how is that possible?
Try this:
import xml.etree.ElementTree as ET
# Read the file (called alpha.txt) and extract the lines
lines = []
with open('alpha.txt', 'r') as txtF:
lines = txtF.readlines()
# A dictionary to hold PO_ID and RAN values
values = {}
# If there are multiple values of PO_ID or RAN then it will take the last entry in the text file
for line in lines:
line = line.strip()
if 'RAN' in line:
values['RAN'] = line[line.find('RAN')+len('RAN')+1:]
elif 'PO_ID' in line:
values['PO_ID'] = line[line.find('PO_ID')+len('PO_ID')+1:]
else:
continue
tree = ET.parse('alpha.xml')
root = tree.getroot()
for val in root.findall('PO'):
val.find('PO_ID').text = values['RAN']
val.find('RAN').text = values['PO_ID']
tree.write('output1.xml')

Adding Coldfusion10 dictionary to CFEclipse Plugin

I downloaded CfEclipse plugin (http://www.cfeclipse.org/update) for Eclipse 4.2.2. I can't see the support for Coldfusion 10. How to add Coldfusion 10 tags/functions?
Use the CFML 10 and CFML 11 dictionary from a CFBuilder3 install, which uses the same dictionary format. Just take the dictionary from CFBuilder3 and drop it into the CFBuilder2 dictionary folder and add the following to the "dictionaryconfig.xml" file:
<version key="ColdFusion11" label="ColdFusion 11">
<grammar location="cf11.xml" />
</version>
<version key="ColdFusion10" label="ColdFusion 10">
<grammar location="cf10.xml" />
</version>
The dictionary files are located in the "CFBuilder" plugins directory and have the word "dictionary" in the folder nameā€”for example:
E:\cfbuilder\plugins\com.adobe.ide.coldfusion.dictionary_2.0.1.282422\dictionary