2016-09-29 7 views
1

Ich lade gerade eine SVG-Datei und analysiere sie, um die Daten zu extrahieren und bestimmte Dinge über das Dokument zu bestimmen. Eine Sache, die ich anzeigen möchte, ist die Layer Traceability des aktuellen Knoten.Ebenen aus SVG extrahieren

Edit: Erstellen von SVG-Dokument

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document doc = builder.parse(svg); 

String xpathIDExp = "//g/@id"; 

XPathFactory xpf = XPathFactory.newInstance(); 
XPath xpath = xpf.newXPath(); 
XPathExpression expression = xpath.compile(xpathIDExp); 

svgIDPaths = (NodeList)expression.evaluate(doc, XPathConstants.NODESET); 

..

private void printText(String output, String errorMsg) { 

     String parentName = new String(); 

     for (int i = 0; i < svgIDs.getLength(); i++) { 
      Node node = svgIDs.item(i); 
      String name = node.getNodeValue(); 
      if (node.getNodeValue().equals(output)) { 
       Node parent = node.getParentNode(); 
       parentName = node.getParentNode().getNodeValue(); 

      } 
     } 
} 

Ausgang und errorMsg sind, was ich (aktuellen Knotenwert und benutzerdefinierte Fehlermeldung) angezeigt werden versuchen. Ich möchte den übergeordneten Knoten zum aktuellen Knoten hinzufügen, um die Layer anzuzeigen. Der Elternknoten ist jedoch null für jeden Knoten, auf den ich zugreife.

Gibt es eine Möglichkeit, dies zu tun?

Auch ich benutze xPath und Apache POI zum Laden/Parsen von SVG.

Edit: Der Elternknoten ist Null, und ich bin auf die ID-Werte des SVG zugreifen, so dass die getNodeValue() sollte das ID-Feld sein.

svgIds ist eine Knotenliste, die alle Knoten enthält, die mit Hilfe von xpath aus dem ID-Feld extrahiert wurden.

Edit: SVG Doc

<?xml version="1.0" encoding="utf-8"?> 
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg version="1.1" onload="initBlackBoard(evt); initClock(evt)" 
    xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="792px" height="612px" 
    viewBox="0 0 792 612" enable-background="new 0 0 792 612" xml:space="preserve"> 
<defs> 

</defs> 
<symbol id="SYMBOL_1" viewBox="-16.667 -16.666 33.333 33.333"> 
    <polygon fill="#812C24" points="16.667,-16.666 -16.667,-16.666 -16.667,16.667 16.667,16.667  "/> 
</symbol> 
<symbol id="Symbol_2" viewBox="-23.333 -23.334 46.667 46.667"> 
    <path fill="#09743B" d="M23.333,0c0-12.886-10.447-23.333-23.333-23.333c-12.886,0-23.333,10.447-23.333,23.333 
     c0,12.887,10.447,23.333,23.333,23.333C12.886,23.333,23.333,12.886,23.333,0z"/> 
</symbol> 
<g id="TEXT__x26__OUTLINE"> 
    <text transform="matrix(1 0 0 1 43.9995 42.2339)"><tspan x="0" y="0" font-family="'MyriadPro-Regular'" font-size="12">Point names that are</tspan><tspan x="0" y="14.4" font-family="'MyriadPro-Regular'" font-size="12">linked to more than one</tspan><tspan x="0" y="28.8" font-family="'MyriadPro-Regular'" font-size="12">symbol</tspan></text> 
    <line fill="none" stroke="#000000" stroke-miterlimit="10" x1="19.555" y1="100.778" x2="772.889" y2="100.778"/> 
    <line fill="none" stroke="#000000" stroke-miterlimit="10" x1="185.111" y1="15.26" x2="185.111" y2="590.815"/> 
    <line fill="none" stroke="#000000" stroke-miterlimit="10" x1="394" y1="15.26" x2="394" y2="590.815"/> 
    <line fill="none" stroke="#000000" stroke-miterlimit="10" x1="602.889" y1="15.26" x2="602.889" y2="590.815"/> 
    <text transform="matrix(1 0 0 1 240.7773 49.4341)"><tspan x="0" y="0" font-family="'MyriadPro-Regular'" font-size="12">Analog points that are</tspan><tspan x="0" y="14.4" font-family="'MyriadPro-Regular'" font-size="12">linked to more than once</tspan></text> 
    <text transform="matrix(1 0 0 1 411.2217 56.6338)" font-family="'MyriadPro-Regular'" font-size="12">Linked points to compare to csv file</text> 
    <text transform="matrix(1 0 0 1 626.2217 35.0337)"><tspan x="0" y="0" font-family="'MyriadPro-Regular'" font-size="12">SVG interactivity is enabled</tspan><tspan x="0" y="14.4" font-family="'MyriadPro-Regular'" font-size="12">on this display and screen</tspan><tspan x="0" y="28.8" font-family="'MyriadPro-Regular'" font-size="12">shots of what the menu items </tspan><tspan x="0" y="43.2" font-family="'MyriadPro-Regular'" font-size="12">look like are provided below</tspan></text> 
</g> 
<g id="Layer_2"> 
    <g id="SYMBOL_LINK-1"> 

      <use xlink:href="#SYMBOL_1" width="33.333" height="33.333" x="-16.667" y="-16.666" transform="matrix(1 0 0 -1 60.666 141.8896)" overflow="visible"/> 
    </g> 
    <g id="Symbol_LINK-1"> 

      <use xlink:href="#Symbol_2" width="46.667" height="46.667" x="-23.333" y="-23.334" transform="matrix(1 0 0 -1 60.666 205.2227)" overflow="visible"/> 
    </g> 
    <text transform="matrix(1 0 0 1 101.7783 145.668)" font-family="'MyriadPro-Regular'" font-size="12">Symbol 1</text> 
    <text transform="matrix(1 0 0 1 101.7783 207.335)" font-family="'MyriadPro-Regular'" font-size="12">Symbol 2</text> 
    <g id="Value_ANALOGPOINT"> 
     <text transform="matrix(1 0 0 1 226.2222 133.001)" font-family="'MyriadPro-Regular'" font-size="12">XXXX</text> 
    </g> 
    <g id="Value_ANALOGPOINT_1_"> 
     <text transform="matrix(1 0 0 1 226.2222 163.001)" font-family="'MyriadPro-Regular'" font-size="12">XXXX</text> 
    </g> 
</g> 
<g id="Layer_1"> 

     <image overflow="visible" width="261" height="232" xlink:href="Screen Shot 2016-09-09 at 1.58.34 PM.png" transform="matrix(0.63 0 0 0.63 611.2217 224.1123)"> 
    </image> 

     <image overflow="visible" width="500" height="329" xlink:href="Screen Shot 2016-09-09 at 1.58.41 PM.png" transform="matrix(0.3 0 0 0.3 618.4443 119.668)"> 
    </image> 

     <image overflow="visible" width="239" height="216" xlink:href="Screen Shot 2016-09-09 at 2.12.18 PM.png" transform="matrix(0.7229 0 0 0.7229 607.0547 390.7773)"> 
    </image> 
    <g id="Value_Hour"> 
     <text transform="matrix(1 0 0 1 683.999 582.6289)" font-family="'MyriadPro-Regular'" font-size="12">XX</text> 
    </g> 
    <g id="Value_Minute"> 
     <text transform="matrix(1 0 0 1 702.1074 583.0049)" font-family="'MyriadPro-Regular'" font-size="13.2778">XX</text> 
    </g> 
    <g id="Value_Second"> 
     <text transform="matrix(1 0 0 1 721.7773 583.0059)" font-family="'MyriadPro-Regular'" font-size="13.2778">XX</text> 
    </g> 
    <text transform="matrix(1 0 0 1 637.332 583.0049)" font-family="'MyriadPro-Regular'" font-size="12">Clock</text> 
</g> 
</svg> 
+0

Betrachten Sie uns, welche Art von SVG Sie haben und wo Sie Ihre Variablen wie 'svgIDs' deklarieren und initialisieren. Wie für Null-Werte, ist der Elternknoten selbst null oder nur die 'getNodeValue()'? Im W3C-DOM-Element haben Knoten immer einen Nullknotenwert. Möglicherweise müssen Sie erläutern, welche Daten Sie benötigen, bevor wir feststellen können, auf welche DOM-Methode oder Eigenschaft Sie zugreifen müssen. –

+0

Ich habe es aktualisiert, um Ihre Fragen zu beantworten. Das zweite Bit des Codes befindet sich in einer separaten Klasse und SvgIDs ist ein Verweis auf SvgIDPaths. Wiederholen Sie das Übergeordnete Knotenobjekt für jeden Knoten als NULL. –

Antwort

0

Funktion den übergeordneten Namen des curent Knoten zu finden (Knoten ist die aktuelle id des Knotens). Jetzt versuche ich auch, alle übergeordneten Namen über diesen zu finden (Schleife). Wenn jemand Vorschläge hat, die hilfreich wären.

private String findParentName(String node) { 

     Node parentNode; 
     String parentName; 
     String nodeName = node; 

     try { 
      StringBuilder xpathIDExp = new StringBuilder(); 
      xpathIDExp.append("//g[@id = '").append(nodeName).append("']/../@id"); 

      XPathFactory xpf = XPathFactory.newInstance(); 
      XPath xpath = xpf.newXPath(); 
      XPathExpression expression = xpath.compile(xpathIDExp.toString()); 

      parentNode = (Node)expression.evaluate(svgDoc, XPathConstants.NODE); 
      parentName = parentNode.getNodeValue(); 

      if (!parentName.isEmpty()) { 
       StringBuilder st = new StringBuilder(); 

       st.append("'").append(parentName).append(" > ").append(nodeName).append("'"); 
       nodeName = st.toString(); 
      } 
     } catch (XPathExpressionException ex) { 
      Logger.getLogger(SVGParser.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     return nodeName; 
    }