Frage

Ich habe eine XmlDocument in java erstellt mit dem Weblogic XmlDocument parser.

Ich will ersetzen Sie den Inhalt von Tags in dieser XMLDocument mit meinen eigenen Daten, oder legen Sie den tag, wenn er nicht da.

<customdata>
   <tag1 />
   <tag2>mfkdslmlfkm</tag2>
   <location />
   <tag3 />
</customdata>

Ich zum Beispiel wollen fügen Sie einige URL in der Standort-tag:

<location>http://something</location>

aber sonst belassen Sie die XML ist.

Derzeit nutze ich einen XMLCursor:

    XmlObject xmlobj = XmlObject.Factory.parse(a.getCustomData(), options);
    XmlCursor xmlcur = xmlobj.newCursor();

    while (xmlcur.hasNextToken()) {
      boolean found = false;
      if (xmlcur.isStart() && "schema-location".equals(xmlcur.getName().toString())) {
        xmlcur.setTextValue("http://replaced");
        System.out.println("replaced");
        found = true;
      } else if (xmlcur.isStart() && "customdata".equals(xmlcur.getName().toString())) {
        xmlcur.push();
      } else if (xmlcur.isEnddoc()) {
        if (!found) {
          xmlcur.pop();
          xmlcur.toEndToken();
          xmlcur.insertElementWithText("schema-location", "http://inserted");
          System.out.println("inserted");
        }

      }
      xmlcur.toNextToken();
    }

Ich habe versucht zu finden, eine "schnelle" xquery Weg, dies zu tun, da die XmlDocument hat ein execQuery Methode, aber didn ' T finden es sehr einfach.

Tun jemand einen besseren Weg als diesen?Es scheint ein wenig aufwändig.

War es hilfreich?

Lösung

Wie über eine XPath-basierte Ansatz?Ich mag diesen Ansatz, da die Logik ist super-einfach zu verstehen.Der code ist ziemlich selbsterklärend ist.

Wenn Ihr xml-Dokument stehen Ihnen zur Verfügung, wie ein org.w3c.dom.Document-Objekt (wie die meisten Parser zurück), dann könnten Sie etwas wie die folgende:

// get the list of customdata nodes
NodeList customDataNodeSet = findNodes(document, "//customdata" );

for (int i=0 ; i < customDataNodeSet.getLength() ; i++) {
  Node customDataNode = customDataNodeSet.item( i );

  // get the location nodes (if any) within this one customdata node
  NodeList locationNodeSet = findNodes(customDataNode, "location" );

  if (locationNodeSet.getLength() > 0) {
    // replace
    locationNodeSet.item( 0 ).setTextContent( "http://stackoverflow.com/" );
  }
  else {
    // insert
    Element newLocationNode = document.createElement( "location" );
    newLocationNode.setTextContent("http://stackoverflow.com/" );
    customDataNode.appendChild( newLocationNode );
  }
}

Und hier ist die helper-Methode findNodes, die die XPath-Suche.

private NodeList findNodes( Object obj, String xPathString )
  throws XPathExpressionException {

  XPath xPath = XPathFactory.newInstance().newXPath();
  XPathExpression expression = xPath.compile( xPathString );
  return (NodeList) expression.evaluate( obj, XPathConstants.NODESET );
}

Andere Tipps

Wie wäre es mit einem Objekt-orientierten Ansatz?Sie konnte deserialise die XML in ein Objekt, und legen Sie die Lage Wert auf das Objekt, dann serialise wieder im XML-Format.

XStream macht das wirklich einfach.

Zum Beispiel würden Sie definieren die Haupt-Objekt, in Ihrem Fall ist CustomData (ich bin mit öffentlichen Feldern um das Beispiel einfach):

public class CustomData {
  public String tag1;
  public String tag2;
  public String location;
  public String tag3;
}

Dann initialisieren Sie XStream:

XStream xstream = new XStream();
// if you need to output the main tag in lowercase, use the following line
xstream.alias("customdata", CustomData.class);  

Jetzt bauen Sie ein Objekt aus XML, setzen Sie das Feld "Standort" auf das Objekt und regenerieren die XML:

CustomData d = (CustomData)xstream.fromXML(xml);
d.location = "http://stackoverflow.com";
xml = xstream.toXML(d);

Na, wie klingt das?

Wenn Sie nicht wissen, das schema, den XStream Lösung ist wahrscheinlich nicht der Weg zu gehen.Mindestens XStream ist auf Ihrem radar jetzt, könnte in handliches kommen in der Zukunft!

Sie sollten in der Lage sein, dies zu tun mit query

versuchen Sie es

 fn:replace(string,pattern,replace)

Ich bin neu in xquery mich und ich habe gefunden, dass es eine schmerzhafte Abfrage-Sprache, mit zu arbeiten, aber es funktioniert ruhig auch einmal über die anfängliche Lernkurve.

Ich habe immer noch wünschte, es gäbe einen einfacheren Weg, das war so effizient?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top