我已经使用UML2生成器从model.xml生成了一个UML文件。
现在我想替换在xmi中创建的生成的id:id =“generated id”。
下面是生成的UML代码的片段。
<packagedElement xmi:type="uml:Package" xmi:id="_lAAK0A34Eeap1Y_jd5mZDA" name="java">
<packagedElement xmi:type="uml:Package" xmi:id="_lAAK0Q34Eeap1Y_jd5mZDA" name="lang">
<packagedElement xmi:type="uml:DataType" xmi:id="_lAAK0g34Eeap1Y_jd5mZDA" name="String"/>
<packagedElement xmi:type="uml:DataType" xmi:id="_lAAK0w34Eeap1Y_jd5mZDA" name="Boolean"/>
<packagedElement xmi:type="uml:DataType" xmi:id="_lAAK1A34Eeap1Y_jd5mZDA" name="Byte"/>
<packagedElement xmi:type="uml:DataType" xmi:id="_lAAK1Q34Eeap1Y_jd5mZDA" name="Character"/>
<packagedElement xmi:type="uml:DataType" xmi:id="_lAAK1g34Eeap1Y_jd5mZDA" name="Double"/>
<packagedElement xmi:type="uml:DataType" xmi:id="_lAAK1w34Eeap1Y_jd5mZDA" name="Float"/>
<packagedElement xmi:type="uml:DataType" xmi:id="_lAAK2A34Eeap1Y_jd5mZDA" name="Integer"/>
<packagedElement xmi:type="uml:DataType" xmi:id="_lAAK2Q34Eeap1Y_jd5mZDA" name="Long"/>
<packagedElement xmi:type="uml:DataType" xmi:id="_lAAK2g34Eeap1Y_jd5mZDA" name="Short"/>
</packagedElement>
</packagedElement>
我尝试使用正则表达式删除ID。首先,我读取文件并将其转换为字符串,然后我找到一个使用Matcher的模式并尝试替换它。一个问题是,生成的ID类似但不相同,我不知道如何解决这个问题。我想这不起作用,因为它只需要第一个?
Path path = profileFile.toPath();
Charset charset = StandardCharsets.UTF_8;
String replaceString = "";
String content = new String(Files.readAllBytes(path), charset);
Pattern pattern = Pattern.compile("xmi:id=\"([A-Za-z0-9_]*)\"");
Matcher matcher = pattern.matcher(content);
if (matcher.find())
{
replaceString = matcher.group(0);
Pattern p = Pattern.compile("\"([^\"]*)\"");
Matcher m = p.matcher(replaceString);
if (m.find())
{
System.out.println("is this the real life: " + m.group(1));
replaceString = m.group(1);
}
}
// content = content.replaceAll("xmi:id=\"([A-Za-z0-9_]*)\"", "xmi:id=\"\"");
content = content.replaceAll(replaceString, "");
Files.write(path, content.getBytes(charset));
任何想法都表示赞赏,你可以向我推进正确的方向。我的大脑现在有点模糊。
答案 0 :(得分:3)
我相信只需拨打一次replaceAll()
即可离开:
String input = "<packagedElement xmi:type=\"uml:DataType\" xmi:id=\"_lAAK0g34Eeap1Y_jd5mZDA\" name=\"String\"/>";
String output = input.replaceAll("xmi:id=\".*?\"", "xmi:id=\"\"");
System.out.println("Input:\n" + input);
System.out.println("Output:\n" + output);
<强>输出:强>
Input:
<packagedElement xmi:type="uml:DataType" xmi:id="_lAAK0g34Eeap1Y_jd5mZDA" name="String"/>
Output:
<packagedElement xmi:type="uml:DataType" xmi:id="" name="String"/>
这假设您尝试清空XML标记中的xmi:id
属性,这正是您的问题所暗示的。
答案 1 :(得分:0)
我提到了标记改变了标记,它按照我想要的方式工作。
Path path = profileFile.toPath();
Charset charset = StandardCharsets.UTF_8;
String replaceString = "";
String content = new String(Files.readAllBytes(path), charset);
Pattern pattern = Pattern.compile("xmi:id=\"([A-Za-z0-9_]*)\"");
Matcher matcher = pattern.matcher(content);
while (matcher.find())
{
replaceString = matcher.group(0);
Pattern p = Pattern.compile("\"([^\"]*)\"");
Matcher m = p.matcher(replaceString);
if (m.find())
{
System.out.println("is this the real life: " + m.group(1));
replaceString = m.group(1);
content = content.replaceAll(replaceString, "");
}
}
Files.write(path, content.getBytes(charset));
我只需将外部if matcher.find()更改为while,然后将replaceAll()移动到第二个m.find()中。
我没有尝试过Tim Biegeleisen解决方案。