使用 SAX 修改 XML 文件
Modify XML File with SAX
我目前正在尝试生成一组模型(通过 XML 指定)。为此,我需要更改文件中的单个属性并将其保存在新文件名下。
XML 文件如下所示:
(...)
<place id="P19" initialMarking="0" invariant="< inf" markingOffsetX="0.0" markingOffsetY="0.0" name="P19" nameOffsetX="-5.0" nameOffsetY="35.0" positionX="615.0" positionY="375.0"/>
<place id="P20" initialMarking="0" invariant="< inf" markingOffsetX="0.0" markingOffsetY="0.0" name="P20" nameOffsetX="-5.0" nameOffsetY="35.0" positionX="375.0" positionY="225.0"/>
(...)
需要更改的是 initialMarking 的值从 2 到 999。
这是我目前的情况:
这是我获取要更改的文件列表并将它们传递给解析器的地方
public void parse(String dir){
getFiles(dir);
try {
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
for(int i = 0; i < fileList.length; i++) {
FileReader reader = new FileReader(fileList[i]);
InputSource inputSource = new InputSource(reader);
xmlReader.setContentHandler(new ModelContentHandler());
xmlReader.parse(inputSource);
}
(...)
这是我搜索需要更改的元素的地方:
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
if(localName.equals("place") && atts.getValue(0).equals("P14") && atts.getValue(1).equals("2")){
System.out.println("Initial Marking of " + atts.getValue(0) + " is: " + atts.getValue(1) + "\n");
while(currentTokens <= Configuration.MAX_TOKENS){
System.out.println("Setting initial Tokens to: " + currentTokens);
}
}
}
现在,我不想打印出 "Setting...",而是想更改相应的值并将整个文件保存在某个新名称下,例如 "Model_X_Y_Token.xml"。
这似乎是一件相当简单的事情,但我以前从未使用过 SAX 并且查看 JavaDoc,我什至找不到一个开始的地方。
也许有人可以指出正确的方向?
这里最好的方法之一是使用 dom4j。我不完全了解你正在尝试做什么,但我明白你想要得到的结果。请注意,为此您还需要 jaxen。
第 1 步:将文件读入 xml doxument
for(int i=0; i<fileList.length; i++){
Document doc = new SAXReader().read(fileList[i]);
}
第2步:解析你需要的元素。为此,您需要了解一些 xpath。 ///place 将获取所有 place 元素。 ///place[@id="P14"] 将只获取一个位置元素。
Element place14 = (Element) doc.selectSingleNode("//*/place[@id="p14" and initialMarking="2"]");
第 3 步:更改元素的属性
plac14.attribute("attributename").setValue("attributeValue");
可能最有效的方法是使用 vtd-xml,因为它是唯一的 API 执行增量更新的方法...
import com.ximpleware.*;
public class changeAttrVal {
public static void main(String s[]) throws VTDException,java.io.UnsupportedEncodingException,java.io.IOException{
VTDGen vg = new VTDGen();
if (!vg.parseFile("input.xml", false))
return;
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
XMLModifier xm = new XMLModifier(vn);
ap.selectXPath("/*/place[@id=\"p14\" and @initialMarking=\"2\"]/@initialMarking");
int i=0;
while((i=ap.evalXPath())!=-1){
xm.updateToken(i+1, "499");// change initial marking from 2 to 499
}
xm.output("new.xml"); // output to a new document called new.xml
}
}
我目前正在尝试生成一组模型(通过 XML 指定)。为此,我需要更改文件中的单个属性并将其保存在新文件名下。
XML 文件如下所示:
(...)
<place id="P19" initialMarking="0" invariant="< inf" markingOffsetX="0.0" markingOffsetY="0.0" name="P19" nameOffsetX="-5.0" nameOffsetY="35.0" positionX="615.0" positionY="375.0"/>
<place id="P20" initialMarking="0" invariant="< inf" markingOffsetX="0.0" markingOffsetY="0.0" name="P20" nameOffsetX="-5.0" nameOffsetY="35.0" positionX="375.0" positionY="225.0"/>
(...)
需要更改的是 initialMarking 的值从 2 到 999。
这是我目前的情况: 这是我获取要更改的文件列表并将它们传递给解析器的地方
public void parse(String dir){
getFiles(dir);
try {
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
for(int i = 0; i < fileList.length; i++) {
FileReader reader = new FileReader(fileList[i]);
InputSource inputSource = new InputSource(reader);
xmlReader.setContentHandler(new ModelContentHandler());
xmlReader.parse(inputSource);
}
(...)
这是我搜索需要更改的元素的地方:
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
if(localName.equals("place") && atts.getValue(0).equals("P14") && atts.getValue(1).equals("2")){
System.out.println("Initial Marking of " + atts.getValue(0) + " is: " + atts.getValue(1) + "\n");
while(currentTokens <= Configuration.MAX_TOKENS){
System.out.println("Setting initial Tokens to: " + currentTokens);
}
}
}
现在,我不想打印出 "Setting...",而是想更改相应的值并将整个文件保存在某个新名称下,例如 "Model_X_Y_Token.xml"。
这似乎是一件相当简单的事情,但我以前从未使用过 SAX 并且查看 JavaDoc,我什至找不到一个开始的地方。 也许有人可以指出正确的方向?
这里最好的方法之一是使用 dom4j。我不完全了解你正在尝试做什么,但我明白你想要得到的结果。请注意,为此您还需要 jaxen。
第 1 步:将文件读入 xml doxument
for(int i=0; i<fileList.length; i++){
Document doc = new SAXReader().read(fileList[i]);
}
第2步:解析你需要的元素。为此,您需要了解一些 xpath。 ///place 将获取所有 place 元素。 ///place[@id="P14"] 将只获取一个位置元素。
Element place14 = (Element) doc.selectSingleNode("//*/place[@id="p14" and initialMarking="2"]");
第 3 步:更改元素的属性
plac14.attribute("attributename").setValue("attributeValue");
可能最有效的方法是使用 vtd-xml,因为它是唯一的 API 执行增量更新的方法...
import com.ximpleware.*;
public class changeAttrVal {
public static void main(String s[]) throws VTDException,java.io.UnsupportedEncodingException,java.io.IOException{
VTDGen vg = new VTDGen();
if (!vg.parseFile("input.xml", false))
return;
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
XMLModifier xm = new XMLModifier(vn);
ap.selectXPath("/*/place[@id=\"p14\" and @initialMarking=\"2\"]/@initialMarking");
int i=0;
while((i=ap.evalXPath())!=-1){
xm.updateToken(i+1, "499");// change initial marking from 2 to 499
}
xm.output("new.xml"); // output to a new document called new.xml
}
}