2011-02-05 34 views
6

Tôi có tệp XML và tôi muốn tạo biểu đồ với một số thực thể, sau đó lưu trữ biểu đồ này trong hình ảnh, JPG hoặc PNG.Tạo hình ảnh biểu đồ (png, jpg ..) từ tệp XML bằng Java

Vì vậy, có một thư viện trong Java làm như thế này ?? Hoặc có một số thủ thuật bằng cách phân tích các tệp XML và ... ???

Dưới đây là một ví dụ tập tin XML:

<?xml version="1.0"?> 
<process> 
    <p n="1">Tove</p> 
    <p n="2">Jani</p> 
    <p n="2">Bill</p> 
    <p n="4">John</p> 
</process> 

Và kết quả sẽ là như thế này:

enter image description here

+0

Dường như http://www.graphviz.org/ cung cấp đã gì Bạn sẽ sẵn sàng để thực hiện. – Rekin

Trả lời

7

Bạn có thể trích xuất các tên bằng một trong những vô số các thư viện XML Java. Dưới đây là một ví dụ sử dụng XPath từ một Java DOM:

private static List<String> findNames(Document doc) 
              throws XPathExpressionException { 
    XPath xpath = XPathFactory.newInstance().newXPath(); 
    NodeList nodes = (NodeList) xpath.evaluate("/process/p", doc, 
                XPathConstants.NODESET); 
    List<String> names = new ArrayList<String>(); 
    for (int i = 0; i < nodes.getLength(); i++) { 
    names.add(nodes.item(i).getTextContent()); 
    } 
    return names; 
} 

Lưu ý: nó có thể là một lỗi đánh máy, nhưng XML của bạn không cũng được hình thành - giá trị thuộc tính phải được trích dẫn. Phân tích cú pháp XML sẽ thất bại nếu không.

some boxes

Bạn có thể sử dụng AWT API để vẽ bất cứ điều gì bạn muốn:

private static final int BORDER = 1; 
private static final int PADDING = 2; 
private static final int SPACER = 5; 

private static void draw(Graphics2D g, List<String> names) { 
    FontMetrics metrics = g.getFontMetrics(); 
    Rectangle box = new Rectangle(1, 1, 0, 0); 
    box.height = metrics.getHeight() + (PADDING * 2); 
    g.setColor(Color.WHITE); 
    for (String name : names) { 
    box.width = metrics.stringWidth(name) + (PADDING * 2); 
    g.drawString(name, box.x + BORDER + PADDING, PADDING + BORDER + 
                metrics.getHeight()); 
    g.drawRect(box.x, box.y, box.width, box.height); 
    box.x += box.width + (BORDER * 2) + SPACER; 
    } 
} 

Mã này chỉ thu hút những tên tuổi với một số hộp xung quanh họ. Tôi chắc chắn rằng offsets của tôi là tất cả các nơi, nhưng bạn có thể có được ý tưởng.

Có một imageio API rằng có thể lưu trong một vài định dạng dữ liệu phổ biến:

private static void save(List<String> names, File file) throws IOException { 
    BufferedImage image = new BufferedImage(600, 50, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g = image.createGraphics(); 
    try { 
    draw(g, names); 
    } finally { 
    g.dispose(); 
    } 
    ImageIO.write(image, "png", file); 
} 
+0

Cảm ơn người đàn ông! Tôi tìm thấy một lớp học trong java đó là công ty với GraphViz để extraxt một hình ảnh cuối cùng sau khi phân tích cú pháp các tập tin XML và và đầu ra một đại diện GraphViz http://www.loria.fr/~szathmar/off/projects/java/GraphVizAPI/index .php # history – alibenmessaoud

6

tôi muốn phân tích cú pháp XML và đầu ra một Graphviz DOT đại diện như thế này:

digraph { 
    Tove -> Jani 
    Jani -> Bill 
    Bill -> John 
} 

Sau đó tôi d gọi dấu chấm Graphviz từ Java bằng cách sử dụng ProcessRunner:

dot -Tpng -o file.png file.dot 

Xem http://graphviz.org để biết thêm thông tin.

0

Cảm ơn mọi người!

Tôi tìm thấy một lớp trong java đó là doanh nghiệp với GraphViz để extraxt một hình ảnh cuối cùng sau khi phân tích các tập tin XML và đầu ra một đại diện GraphViz, Follow this link. Tốt với hai phương pháp của McDowell Tôi có thể phân tích cú pháp các tệp XML dễ dàng.

Trân trọng

Các vấn đề liên quan