Hallo,
also nachdem ich unter Java 1.3.1 arbeiten muss und die Methode replaceAll leider nicht zur Verfügung steht wollte ich replaceAll quasi selber nachimplementieren. Zumindest so, dass es für meine zwecke einigermaßen passt.
So ich habe jetzt seeeeeehr merkwürdige Probleme. Ich kann die Probleme kaum in Worte fassen.
Also....hier ist mal mein Replace algorithmus.
In der main wird zum test eine XML file eingelesen.
Ich möchte dort wo tags Fehlen, die fehlenden Tags einfügen.
Das ganze sieht so aus. Ich habe dafür eine Methode:
public static String replaceTags(String xml_output, String firstTag,
String secondTag, String insertion)
Diese Methode prüft folgendes:
Wenn zwischen dem firstTag und dem secondTag nichts steht, dann wird ein String "insertion" eingefügt!
In meinem Testscenario fehlt das <chd> blabla </chd> tag. Dies muss zwischen </anc> und <sib> stehen. Also wenn man solch eine Stelle findet </anc> und <sib>, dann muss dort das <chd> Tag eingefügt werden.
Das lustige ist jetzt, dass die richtige Stelle gefunden wird, aber etwas falsches eingefügt wird. Ich bin gerade etwas am durchdrehen, ich kann den bug einfach nicht finden.
Die XML mit der ich teste sieht wie folgend aus:
Ich bin mir jetzt nicht sicher, obs eventuell Probleme mit den Strings gibt. Den String insertion verwende ich zum Beispiel immer wieder. Wird beim Methoden aufruf ja immer wieder neu belegt. Kann soetwas zu Problemen führen? Ansonsten, falls irgend jemand bei meinem Algorithmus durchblicken sollte und irgendeine Ahnung hat wie die komischen Fehler zustande kommen wäre ich sehr dankbar für hinweise.
also nachdem ich unter Java 1.3.1 arbeiten muss und die Methode replaceAll leider nicht zur Verfügung steht wollte ich replaceAll quasi selber nachimplementieren. Zumindest so, dass es für meine zwecke einigermaßen passt.
So ich habe jetzt seeeeeehr merkwürdige Probleme. Ich kann die Probleme kaum in Worte fassen.
Also....hier ist mal mein Replace algorithmus.
Code:
package rmi;
import java.io.BufferedReader;
import java.io.FileReader;
public class ReplaceTags2 {
public static String replaceTags(String xml_output, String firstTag,
String secondTag, String insertion) {
//System.out.println(insertion);
int firstTagSize = firstTag.length(); // example:</anc> = 6
int secondTagSize = secondTag.length(); // exmaple:<chd> =5
int insertposition = 0; // position where to insert the tags
boolean needChange = false; // determines if an insertion is needed
int j = 0; // count parameter to determine the position of the firsTag
for (int i = 0; i < xml_output.length(); i++) {
if (xml_output.charAt(i) == firstTag.charAt(j)) {
j++;
if (j == firstTagSize) {
// System.out.println("First tag recognized");
insertposition = i;
// ignore whitespaces between
// tags-example:</anc>[whitepsaces]<sib>
while ((xml_output.charAt(i + 1) == ' ')
|| (xml_output.charAt(i + 1) == '\n')) {
//System.out.println(xml_output.charAt(i+1));
i++;
} // end while
i++;
// Test for second tag
for (int k = 0; k < secondTagSize; k++) {
if (xml_output.charAt(i) == secondTag.charAt(k)) {
i++;
if (k == secondTagSize - 1) {
// .out.println("SecondTagRecognized");
needChange = true;
}// end inner if -secondTag
} // end outer if -secondTag
else {
j = 0;
break;
}// end outer else
}// end inner for
}// end inner if-first Tag
}// end outer if-first Tag
if (needChange) {
break;
}// end if needChange
else {
//j = 0;
// insertposition = 0;
}// else - reset
}// end outer for
// System.out.println(firstTag+" "+secondTag+" "+needChange);
if (needChange) {
System.out.println("true");
System.out.println("Insertion:\n"+ insertion);
System.out.println();
System.out.println(firstTag);
System.out.println(secondTag);
System.out.println();
String xml_start = xml_output.substring(0, insertposition + 1);
String xml_end = xml_output.substring(insertposition + 1);
String new_xml = xml_start + insertion + xml_end;
return new_xml;
} // end if examine Change
else {
System.out.println("false");
return xml_output;
} // end else
}
public static String insertMissingTags(String xml_output) {
// no ccp
String new_output1 = replaceTags(
xml_output,
"</cxn>",
"<anc>",
"\n<ccp>\n<cxtMember>\n<cxs>BUBUUU</cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</ccp>\n");
String new_output2 = replaceTags(
new_output1,
"</cxn>",
"<chd>",
"\n<ccp>\n<cxtMember>\n<cxs>BIBOOOOO</cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</ccp>\n<anc>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</anc>\n");
String new_output3 = replaceTags(
new_output2,
"</cxn>",
"<sib>",
"\n<ccp>\n<cxtMember>\n<cxs>BOBOOOOOOOOO</cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</ccp>\n<anc>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</anc>\n<chd>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</chd>\n");
String new_output4 = replaceTags(
new_output3,
"</cxn>",
"</sourceCxt>",
"\n<ccp>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</ccp>\n<anc>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</anc>\n<chd>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</chd><sib>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</sib>\n");
// no anc
String new_output5 = replaceTags(
new_output4,
"</ccp>",
"<chd>",
"\n<anc>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</anc>\n<chd>");
System.out.println("hi");
String new_output6 = replaceTags(
new_output5,
"</ccp>",
"<sib>",
"\n<anc>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</anc>\n<chd>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</chd>\n");
String new_output7 = replaceTags(
new_output6,
"</ccp>",
"</sourceCxt>",
"\n<anc>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</anc>\n<chd>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</chd>\n<sib>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</sib>\n");
// no chd
String new_output8 = replaceTags(
new_output7,
"</anc>",
"<sib>",
"\n<chd>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</chd>\n");
String new_output9 = replaceTags(
new_output8,
"</anc>",
"</sourceCxt>",
"\n<chd>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</chd>\n<sib>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</sib>\n");
// no sib
String result = replaceTags(
new_output9,
"</chd>",
"</sourceCxt>",
"\n<sib>\n<cxtMember>\n<cxs></cxs>\n<cui2></cui2>\n<aui2></aui2>\n<rank>1</rank>\n<hcd /><rel /><xc /></cxtMember>\n</sib>\n");
return result;
}
public static void main(String[] args) {
// String xml_output = "schocki<anc>ölkök</anc>
// <sib>jlk</sib>llllllllllllllllkkkkkkk";
// System.out.println(insertMissingTags(xml_output));
StringBuffer lesepuffer = new StringBuffer();
String text = "";
try {
FileReader freader = new FileReader(
"C:\\Dokumente und Einstellungen\\Daniel\\Desktop\\Arbeit\\AHA_TEST_WITHOUTCHILD.xml");
BufferedReader in = new BufferedReader(freader);
while ((text = in.readLine()) != null)
lesepuffer.append(text + "\n");
freader.close();
text = new String(lesepuffer);
} catch (Exception eve) {
}
System.out.println(text.length());
String textx = insertMissingTags(text);
System.out.println(textx);
//XMLBaseGenerator objGenerator = new XMLBaseGenerator(textx, "ENG");
//objGenerator.getConceptTerms(textx);
}
}
In der main wird zum test eine XML file eingelesen.
Ich möchte dort wo tags Fehlen, die fehlenden Tags einfügen.
Das ganze sieht so aus. Ich habe dafür eine Methode:
public static String replaceTags(String xml_output, String firstTag,
String secondTag, String insertion)
Diese Methode prüft folgendes:
Wenn zwischen dem firstTag und dem secondTag nichts steht, dann wird ein String "insertion" eingefügt!
In meinem Testscenario fehlt das <chd> blabla </chd> tag. Dies muss zwischen </anc> und <sib> stehen. Also wenn man solch eine Stelle findet </anc> und <sib>, dann muss dort das <chd> Tag eingefügt werden.
Das lustige ist jetzt, dass die richtige Stelle gefunden wird, aber etwas falsches eingefügt wird. Ich bin gerade etwas am durchdrehen, ich kann den bug einfach nicht finden.
Die XML mit der ich teste sieht wie folgend aus:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<MetaCollection version="1.0">
<release>2008AB</release>
<concept>
<cui>C0002458</cui>
<cn>American Heart Association</cn>
<term>
<lui>L0002458</lui>
<tn>American Heart Association</tn>
<ts>P</ts>
<lat>ENG</lat>
<termVariant>
<sui>S0012959</sui>
<stt>PF</stt>
<str>American Heart Association</str>
<strSource>
<sab>MSH</sab>
<scd>D000572</scd>
<srl>0</srl>
<srcinfo>
<aui>A0022536</aui>
<tty>MH</tty>
<scui>M0000892</scui>
<sdui>D000572</sdui>
</srcinfo>
</strSource>
</termVariant>
<termVariant>
<sui>S0012960</sui>
<stt>VO</stt>
<str>American Heart Associations</str>
<strSource>
<sab>MSH</sab>
<scd>D000572</scd>
<srl>0</srl>
<srcinfo>
<aui>A0022537</aui>
<tty>PM</tty>
<scui>M0000892</scui>
<sdui>D000572</sdui>
</srcinfo>
</strSource>
</termVariant>
<termVariant>
<sui>S0016406</sui>
<stt>VW</stt>
<str>Association, American Heart</str>
<strSource>
<sab>MSH</sab>
<scd>D000572</scd>
<srl>0</srl>
<srcinfo>
<aui>A0027278</aui>
<tty>PM</tty>
<scui>M0000892</scui>
<sdui>D000572</sdui>
</srcinfo>
</strSource>
</termVariant>
<termVariant>
<sui>S0016418</sui>
<stt>VO</stt>
<str>Associations, American Heart</str>
<strSource>
<sab>MSH</sab>
<scd>D000572</scd>
<srl>0</srl>
<srcinfo>
<aui>A0027290</aui>
<tty>PM</tty>
<scui>M0000892</scui>
<sdui>D000572</sdui>
</srcinfo>
</strSource>
</termVariant>
<termVariant>
<sui>S0047207</sui>
<stt>VW</stt>
<str>Heart Association, American</str>
<strSource>
<sab>MSH</sab>
<scd>D000572</scd>
<srl>0</srl>
<srcinfo>
<aui>A0066382</aui>
<tty>PM</tty>
<scui>M0000892</scui>
<sdui>D000572</sdui>
</srcinfo>
</strSource>
</termVariant>
<termVariant>
<sui>S0047208</sui>
<stt>VO</stt>
<str>Heart Associations, American</str>
<strSource>
<sab>MSH</sab>
<scd>D000572</scd>
<srl>0</srl>
<srcinfo>
<aui>A0066383</aui>
<tty>PM</tty>
<scui>M0000892</scui>
<sdui>D000572</sdui>
</srcinfo>
</strSource>
</termVariant>
</term>
<term>
<lui>L6529810</lui>
<tn>AMERICAN HEART ASSOC</tn>
<ts>S</ts>
<lat>ENG</lat>
<termVariant>
<sui>S7611515</sui>
<stt>PF</stt>
<str>AMERICAN HEART ASSOC</str>
<strSource>
<sab>MSH</sab>
<scd>D000572</scd>
<srl>0</srl>
<srcinfo>
<aui>A12068031</aui>
<tty>DEV</tty>
<scui>M0000892</scui>
<sdui>D000572</sdui>
<suppressible />
</srcinfo>
</strSource>
</termVariant>
</term>
<definition>
<sab>MSH</sab>
<def>A voluntary organization concerned with the prevention and treatment of heart and vascular diseases.</def>
<aui>A0022536</aui>
<atui>AT38149476</atui>
</definition>
<semanticType>
<tui>T093</tui>
<sty>Health Care Related Organization</sty>
<atui>AT17595867</atui>
</semanticType>
<context>
<sui>S0012959</sui>
<stringCxt>
<sab>MSH</sab>
<scd>D000572</scd>
<aui>A0022536</aui>
<sourceCxt>
<cxn>1</cxn>
<ccp>
<cxtMember>
<cxs>American Heart Association</cxs>
<cui2>C0002458</cui2>
<aui2>A0022536</aui2>
<rank>0</rank>
<hcd>N03.540.630.780.110</hcd>
<rel />
<xc />
</cxtMember>
</ccp>
<anc>
<cxtMember>
<cxs>MeSH</cxs>
<cui2>C1135584</cui2>
<aui2>A0434168</aui2>
<rank>1</rank>
<hcd />
<rel />
<xc />
</cxtMember>
<cxtMember>
<cxs>MeSH Descriptors</cxs>
<cui2>C1256739</cui2>
<aui2>A2367943</aui2>
<rank>2</rank>
<hcd />
<rel />
<xc />
</cxtMember>
<cxtMember>
<cxs>Index Medicus Descriptor</cxs>
<cui2>C1256741</cui2>
<aui2>A2366890</aui2>
<rank>3</rank>
<hcd />
<rel />
<xc />
</cxtMember>
<cxtMember>
<cxs>Health Care (MeSH Category)</cxs>
<cui2>C0018689</cui2>
<aui2>A0135434</aui2>
<rank>4</rank>
<hcd>N</hcd>
<rel />
<xc />
</cxtMember>
<cxtMember>
<cxs>Health Care Economics and Organizations</cxs>
<cui2>C0013562</cui2>
<aui2>A0957609</aui2>
<rank>5</rank>
<hcd>N03</hcd>
<rel />
<xc />
</cxtMember>
<cxtMember>
<cxs>Organizations</cxs>
<cui2>C0029246</cui2>
<aui2>A0095285</aui2>
<rank>6</rank>
<hcd>N03.540</hcd>
<rel />
<xc />
</cxtMember>
<cxtMember>
<cxs>Organizations, Nonprofit</cxs>
<cui2>C0029247</cui2>
<aui2>A0095292</aui2>
<rank>7</rank>
<hcd>N03.540.630</hcd>
<rel />
<xc />
</cxtMember>
<cxtMember>
<cxs>Voluntary Health Agencies</cxs>
<cui2>C0042958</cui2>
<aui2>A0133404</aui2>
<rank>8</rank>
<hcd>N03.540.630.780</hcd>
<rel />
<xc />
</cxtMember>
</anc>
<sib>
<cxtMember>
<cxs>American Cancer Society</cxs>
<cui2>C0002455</cui2>
<aui2>A0022534</aui2>
<rank>0</rank>
<hcd>N03.540.630.780.080</hcd>
<rel />
<xc />
</cxtMember>
<cxtMember>
<cxs>Mental Health Associations</cxs>
<cui2>C0025354</cui2>
<aui2>A0084858</aui2>
<rank>0</rank>
<hcd>N03.540.630.780.500</hcd>
<rel />
<xc />
</cxtMember>
<cxtMember>
<cxs>Red Cross</cxs>
<cui2>C0034907</cui2>
<aui2>A0110262</aui2>
<rank>0</rank>
<hcd>N03.540.630.780.608</hcd>
<rel />
<xc />
</cxtMember>
<cxtMember>
<cxs>Tuberculosis Societies</cxs>
<cui2>C0041304</cui2>
<aui2>A0129257</aui2>
<rank>0</rank>
<hcd>N03.540.630.780.850</hcd>
<rel />
<xc />
</cxtMember>
</sib>
</sourceCxt>
</stringCxt>
</context>
</concept>
</MetaCollection>
Ich bin mir jetzt nicht sicher, obs eventuell Probleme mit den Strings gibt. Den String insertion verwende ich zum Beispiel immer wieder. Wird beim Methoden aufruf ja immer wieder neu belegt. Kann soetwas zu Problemen führen? Ansonsten, falls irgend jemand bei meinem Algorithmus durchblicken sollte und irgendeine Ahnung hat wie die komischen Fehler zustande kommen wäre ich sehr dankbar für hinweise.