{"id":35,"date":"2024-07-26T15:54:43","date_gmt":"2024-07-26T15:54:43","guid":{"rendered":"https:\/\/blog.plantuml.cn\/?p=35"},"modified":"2024-07-26T15:54:45","modified_gmt":"2024-07-26T15:54:45","slug":"creating-class-diagrams-with-plantuml-a-comprehensive-tutorial","status":"publish","type":"post","link":"https:\/\/plantuml.cn\/index.php\/2024\/07\/26\/creating-class-diagrams-with-plantuml-a-comprehensive-tutorial\/","title":{"rendered":"Creating Class Diagrams with PlantUML: A Comprehensive Tutorial"},"content":{"rendered":"\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/07\/plantuml-sample.png\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"introduction-to-plantuml\">Introduction to PlantUML<\/h2>\n\n\n\n<p>PlantUML is a versatile tool that allows users to create&nbsp;<a href=\"prompt:\/\/ask_markdown?question=UML+diagrams\" target=\"_blank\">UML diagrams<\/a>&nbsp;from plain text descriptions. This capability makes it accessible to both novice and experienced users, as it simplifies the process of diagram creation.&nbsp;<a href=\"https:\/\/github.com\/plantuml\/plantuml\" target=\"_blank\" rel=\"noreferrer noopener\">1<\/a><\/p>\n\n\n\n<p>The primary purpose of PlantUML is to help users visualize systems and document software architecture. By converting textual descriptions into graphical representations, it aids in understanding complex systems and facilitates communication among team members.&nbsp;<a href=\"https:\/\/plantuml.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">2<\/a><\/p>\n\n\n\n<p>One of the key benefits of PlantUML is its concise and efficient syntax. This allows users to quickly create and update diagrams without the need for extensive graphical manipulation, making it a time-saving tool for software development and documentation.&nbsp;<a href=\"https:\/\/blog.jetbrains.com\/dotnet\/2020\/10\/06\/create-uml-diagrams-using-plantuml\/\" target=\"_blank\" rel=\"noreferrer noopener\">3<\/a><\/p>\n\n\n\n<p>PlantUML can be seamlessly integrated into various Integrated Development Environments (IDEs) such as&nbsp;<a href=\"prompt:\/\/ask_markdown?question=IntelliJ+IDEA\" target=\"_blank\">IntelliJ IDEA<\/a>&nbsp;and&nbsp;<a href=\"prompt:\/\/ask_markdown?question=Visual+Studio+Code\" target=\"_blank\">Visual Studio Code<\/a>. This integration enhances the user experience by allowing developers to create and manage diagrams within their preferred coding environment.&nbsp;<a href=\"https:\/\/stackoverflow.com\/questions\/75791063\/how-to-create-a-class-diagram-in-android-studio\" target=\"_blank\" rel=\"noreferrer noopener\">4<\/a><\/p>\n\n\n\n<p>The versatility of PlantUML is evident in its support for multiple types of UML diagrams, including class, sequence, use case, and component diagrams. This wide range of supported diagrams makes it a comprehensive tool for documenting different aspects of software systems.&nbsp;<a href=\"https:\/\/plantuml.com\/class-diagram\" target=\"_blank\" rel=\"noreferrer noopener\">5<\/a><\/p>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:704\/1*bBq3lw_9vv-YB-tNSmd6rw.png\"><\/p>\n\n\n\n<p>connect2grp.medium.com<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"basic-syntax-for-class-diagrams\">Basic Syntax for Class Diagrams<\/h2>\n\n\n\n<p>To define a class in PlantUML, you start with the keyword &#8216;class&#8217; followed by the class name. This mirrors the syntax used in many object-oriented programming languages, making it intuitive for developers.&nbsp;<a href=\"https:\/\/plantuml.com\/class-diagram\" target=\"_blank\" rel=\"noreferrer noopener\">5<\/a><\/p>\n\n\n\n<p><a href=\"prompt:\/\/ask_markdown?question=attributes\" target=\"_blank\">attributes<\/a>&nbsp;within a class are defined using the format &#8216;attributeName: dataType&#8217;. This clear and concise syntax allows for easy representation of class properties, ensuring that the diagram accurately reflects the structure of the class.&nbsp;<a href=\"https:\/\/blog.jetbrains.com\/dotnet\/2020\/10\/06\/create-uml-diagrams-using-plantuml\/\" target=\"_blank\" rel=\"noreferrer noopener\">3<\/a><\/p>\n\n\n\n<p><a href=\"prompt:\/\/ask_markdown?question=methods\" target=\"_blank\">methods<\/a>&nbsp;are defined using the format &#8216;methodName()&#8217;. This notation is straightforward and aligns with common programming practices, making it easy to understand and implement.&nbsp;<a href=\"https:\/\/blog.jetbrains.com\/dotnet\/2020\/10\/06\/create-uml-diagrams-using-plantuml\/\" target=\"_blank\" rel=\"noreferrer noopener\">3<\/a><\/p>\n\n\n\n<p>Every PlantUML file must begin with the &#8216;@startuml&#8217; marker and end with the &#8216;@enduml&#8217; marker. These markers delineate the start and end of the UML diagram, ensuring that the syntax is correctly interpreted by the PlantUML tool.&nbsp;<a href=\"https:\/\/blog.jetbrains.com\/dotnet\/2020\/10\/06\/create-uml-diagrams-using-plantuml\/\" target=\"_blank\" rel=\"noreferrer noopener\">3<\/a><\/p>\n\n\n\n<p>For example, the syntax &#8216;class User { name: String; age: int; getName() }&#8217; creates a class named &#8216;User&#8217; with two attributes, &#8216;name&#8217; and &#8216;age&#8217;, and a method &#8216;getName&#8217;. This example demonstrates how to encapsulate class properties and behaviors succinctly.&nbsp;<a href=\"https:\/\/blog.jetbrains.com\/dotnet\/2020\/10\/06\/create-uml-diagrams-using-plantuml\/\" target=\"_blank\" rel=\"noreferrer noopener\">3<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"advanced-syntax-and-features\">Advanced Syntax and Features<\/h2>\n\n\n\n<p><a href=\"prompt:\/\/ask_markdown?question=inheritance\" target=\"_blank\">inheritance<\/a>&nbsp;in PlantUML is represented using the &#8216;&lt;|&#8211;&#8216; symbol. This notation is used to show that one class inherits from another, establishing a parent-child relationship. This is particularly useful in object-oriented design to depict class hierarchies and shared behaviors.&nbsp;<a href=\"https:\/\/plantuml.com\/class-diagram\" target=\"_blank\" rel=\"noreferrer noopener\">5<\/a><\/p>\n\n\n\n<p>Interfaces in PlantUML are defined using the &#8216;<a href=\"prompt:\/\/ask_markdown?question=interface\" target=\"_blank\">interface<\/a>&#8216; keyword followed by the interface name. This allows for the representation of abstract types that define a set of methods without implementing them, ensuring that any class implementing the interface adheres to the specified contract.&nbsp;<a href=\"https:\/\/blog.jetbrains.com\/dotnet\/2020\/10\/06\/create-uml-diagrams-using-plantuml\/\" target=\"_blank\" rel=\"noreferrer noopener\">3<\/a><\/p>\n\n\n\n<p><a href=\"prompt:\/\/ask_markdown?question=relationships\" target=\"_blank\">relationships<\/a>&nbsp;between classes in PlantUML can be depicted using various symbols. For instance, &#8216;&#8211;&#8216; denotes an association, &#8216;*&#8211;&#8216; represents a composition, and &#8216;o&#8211;&#8216; indicates an aggregation. These symbols help in illustrating how classes interact and depend on each other within the system.&nbsp;<a href=\"https:\/\/plantuml.com\/class-diagram\" target=\"_blank\" rel=\"noreferrer noopener\">5<\/a><\/p>\n\n\n\n<p>Abstract classes in PlantUML are defined using the &#8216;<a href=\"prompt:\/\/ask_markdown?question=abstract+class\" target=\"_blank\">abstract class<\/a>&#8216; keyword. Abstract classes cannot be instantiated and are meant to be subclassed. They often contain abstract methods that must be implemented by subclasses, providing a template for other classes to follow.&nbsp;<a href=\"https:\/\/plantuml.com\/class-diagram\" target=\"_blank\" rel=\"noreferrer noopener\">5<\/a><\/p>\n\n\n\n<p><a href=\"prompt:\/\/ask_markdown?question=visibility\" target=\"_blank\">visibility<\/a>&nbsp;of attributes and methods in PlantUML is indicated using specific symbols: &#8216;+&#8217; for public, &#8216;-&#8216; for private, and &#8216;#&#8217; for protected. These symbols help in defining the access level of class members, ensuring encapsulation and proper access control within the class structure.&nbsp;<a href=\"https:\/\/plantuml.com\/class-diagram\" target=\"_blank\" rel=\"noreferrer noopener\">5<\/a><\/p>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/plantuml.com\/imgw\/img-4d1f0a252fbcede278465b10ab3ade50.png\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"layout-control-techniques\">Layout Control Techniques<\/h2>\n\n\n\n<p><a href=\"prompt:\/\/ask_markdown?question=direction+commands\" target=\"_blank\">direction commands<\/a>&nbsp;in PlantUML, such as &#8216;left&#8217;, &#8216;right&#8217;, &#8216;up&#8217;, and &#8216;down&#8217;, are essential for controlling the direction of arrows. These commands help in defining the flow and relationships between different elements in a class diagram, ensuring clarity and readability.&nbsp;<a href=\"https:\/\/plantuml.com\/component-diagram\" target=\"_blank\" rel=\"noreferrer noopener\">6<\/a><\/p>\n\n\n\n<p>Spacing between elements in a PlantUML diagram can be adjusted using the &#8216;NodeSep&#8217; command. This command allows for fine-tuning the distance between nodes, which can be crucial for maintaining a clean and organized layout, especially in complex diagrams.&nbsp;<a href=\"https:\/\/isgb.otago.ac.nz\/infosci\/mark.george\/Wiki\/wiki\/PlantUML%20GraphViz%20Layout\" target=\"_blank\" rel=\"noreferrer noopener\">7<\/a><\/p>\n\n\n\n<p><a href=\"prompt:\/\/ask_markdown?question=invisible+edges\" target=\"_blank\">invisible edges<\/a>, created using the &#8216;style=invis&#8217; command, are a powerful tool for arranging nodes without displaying the connecting lines. This technique can be used to influence the layout subtly, ensuring that nodes are positioned in a desired manner without cluttering the diagram with unnecessary edges.&nbsp;<a href=\"https:\/\/forum.plantuml.net\/1609\/better-control-of-the-layout-of-class-diagrams\" target=\"_blank\" rel=\"noreferrer noopener\">8<\/a><\/p>\n\n\n\n<p>The &#8216;rankdir=LR&#8217; command is used to arrange elements from left to right in a PlantUML diagram. This command is particularly useful for creating horizontal layouts, which can be more intuitive and easier to read, especially when dealing with a sequence of related elements.&nbsp;<a href=\"https:\/\/forum.plantuml.net\/1609\/better-control-of-the-layout-of-class-diagrams\" target=\"_blank\" rel=\"noreferrer noopener\">8<\/a><\/p>\n\n\n\n<p>Fine-tuning the layout of a PlantUML diagram should be approached with caution. While adjustments can improve readability, excessive fine-tuning can lead to unstable layouts. It&#8217;s important to strike a balance between manual adjustments and allowing the layout engine to optimize the diagram automatically.&nbsp;<a href=\"https:\/\/forum.plantuml.net\/1609\/better-control-of-the-layout-of-class-diagrams\" target=\"_blank\" rel=\"noreferrer noopener\">8<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"examples-of-class-diagrams\">Examples of Class Diagrams<\/h2>\n\n\n\n<p>A simple example of a class diagram in PlantUML might include a few classes such as &#8216;User&#8217;, &#8216;Account&#8217;, and &#8216;Transaction&#8217;. These classes can be connected with basic relationships like inheritance and association, providing a clear and concise visual representation of their interactions.&nbsp;<a href=\"https:\/\/plantuml.com\/class-diagram\" target=\"_blank\" rel=\"noreferrer noopener\">5<\/a><\/p>\n\n\n\n<p>For a more complex example, consider a diagram that includes multiple classes, interfaces, and relationships. This might involve abstract classes, multiple inheritance, and various types of associations, offering a detailed view of the system&#8217;s architecture and the interactions between its components.&nbsp;<a href=\"https:\/\/blog.jetbrains.com\/dotnet\/2020\/10\/06\/create-uml-diagrams-using-plantuml\/\" target=\"_blank\" rel=\"noreferrer noopener\">3<\/a><\/p>\n\n\n\n<p>A use case example could document a user management system. This diagram would include classes like &#8216;User&#8217;, &#8216;Admin&#8217;, &#8216;Role&#8217;, and &#8216;Permission&#8217;, showing how users interact with the system, the roles they can assume, and the permissions associated with each role.&nbsp;<a href=\"https:\/\/medium.com\/@shivansh2301\/creating-various-types-of-uml-diagrams-with-plantuml-1d8f5fa46f11\" target=\"_blank\" rel=\"noreferrer noopener\">9<\/a><\/p>\n\n\n\n<p>Component interaction diagrams illustrate how different components of a system interact with each other. For instance, a diagram might show how a &#8216;User Interface&#8217; component communicates with a &#8216;Backend Service&#8217; and a &#8216;Database&#8217;, highlighting the flow of data and control between these components.&nbsp;<a href=\"https:\/\/plantuml.com\/component-diagram\" target=\"_blank\" rel=\"noreferrer noopener\">6<\/a><\/p>\n\n\n\n<p>A real-world example might involve a sample diagram from a project, such as an e-commerce platform. This diagram could include classes like &#8216;Product&#8217;, &#8216;Order&#8217;, &#8216;Customer&#8217;, and &#8216;Payment&#8217;, demonstrating practical usage and providing insights into the system&#8217;s design and functionality.&nbsp;<a href=\"https:\/\/real-world-plantuml.com\/?type=class\" target=\"_blank\" rel=\"noreferrer noopener\">10<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"common-issues-and-troubleshooting\">Common Issues and Troubleshooting<\/h2>\n\n\n\n<p>Syntax errors in PlantUML diagrams often stem from incorrect placement of &#8216;@startuml&#8217; and &#8216;@enduml&#8217; markers. Ensuring these markers are correctly placed at the beginning and end of your PlantUML code is crucial for proper diagram rendering. Misplacement can lead to errors and incomplete diagrams.&nbsp;<a href=\"https:\/\/stackoverflow.com\/questions\/54124455\/plantuml-class-diagram-not-visualized-and-given-error\" target=\"_blank\" rel=\"noreferrer noopener\">11<\/a><\/p>\n\n\n\n<p>Unrecognized commands can be a result of an improperly installed or outdated PlantUML plugin. Verifying the installation and ensuring the plugin is up-to-date can resolve many issues. This step is essential for the correct interpretation of PlantUML syntax and commands.&nbsp;<a href=\"https:\/\/stackoverflow.com\/questions\/54124455\/plantuml-class-diagram-not-visualized-and-given-error\" target=\"_blank\" rel=\"noreferrer noopener\">11<\/a><\/p>\n\n\n\n<p>Layout problems in PlantUML can be mitigated by using direction commands and invisible edges. Commands like &#8216;left&#8217;, &#8216;right&#8217;, &#8216;up&#8217;, and &#8216;down&#8217; can help control the placement of elements. Invisible edges can also be used to fine-tune the layout, although this requires careful handling to avoid instability in the diagram.&nbsp;<a href=\"https:\/\/forum.plantuml.net\/1609\/better-control-of-the-layout-of-class-diagrams\" target=\"_blank\" rel=\"noreferrer noopener\">8<\/a><\/p>\n\n\n\n<p>PlantUML may change the order of fields in a class diagram, which can be controlled using layout hints. By specifying the order and direction of links, you can influence the arrangement of fields and classes, ensuring a more logical and readable diagram.&nbsp;<a href=\"https:\/\/isgb.otago.ac.nz\/infosci\/mark.george\/Wiki\/wiki\/PlantUML%20GraphViz%20Layout\" target=\"_blank\" rel=\"noreferrer noopener\">7<\/a><\/p>\n\n\n\n<p>For complex diagrams, it is advisable to split them into smaller, more manageable parts. This approach not only simplifies the diagram but also enhances readability and comprehension. Breaking down complex structures into simpler sub-diagrams can make the overall system easier to understand and maintain.&nbsp;<a href=\"https:\/\/github.com\/plantuml\/plantuml\/issues\/13\" target=\"_blank\" rel=\"noreferrer noopener\">12<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"best-practices-for-creating-diagrams\">Best Practices for Creating Diagrams<\/h2>\n\n\n\n<p>Organizing elements logically within a diagram is crucial for enhancing readability. By arranging related components together and ensuring a clear flow of information, users can quickly grasp the structure and relationships within the diagram. This practice minimizes confusion and makes the diagram more intuitive.&nbsp;<a href=\"https:\/\/www.ibm.com\/docs\/en\/dma?topic=diagrams-organizing-uml\" target=\"_blank\" rel=\"noreferrer noopener\">13<\/a><\/p>\n\n\n\n<p>Consistency in naming conventions and styles is essential for maintaining clarity and uniformity across diagrams. Using the same naming patterns and visual styles helps users to easily identify and understand different elements, reducing the cognitive load required to interpret the diagram.&nbsp;<a href=\"https:\/\/softwareengineering.stackexchange.com\/questions\/419927\/best-practices-for-maintainable-graphviz-plantuml-code\" target=\"_blank\" rel=\"noreferrer noopener\">14<\/a><\/p>\n\n\n\n<p>Including comments and metadata in your diagrams provides valuable context and version information. This practice ensures that anyone viewing the diagram can understand its purpose, authorship, and any relevant updates, fostering better communication and collaboration among team members.&nbsp;<a href=\"https:\/\/softwareengineering.stackexchange.com\/questions\/419927\/best-practices-for-maintainable-graphviz-plantuml-code\" target=\"_blank\" rel=\"noreferrer noopener\">14<\/a><\/p>\n\n\n\n<p>To avoid overly complex diagrams, it is advisable to split them into smaller, more manageable sections. This approach not only makes each section easier to understand but also allows for more focused analysis and troubleshooting of specific parts of the system.&nbsp;<a href=\"https:\/\/forum.plantuml.net\/1609\/better-control-of-the-layout-of-class-diagrams\" target=\"_blank\" rel=\"noreferrer noopener\">8<\/a><\/p>\n\n\n\n<p>Using version control systems is a best practice for tracking changes and collaborating on diagrams. Tools like Git enable teams to see the history of modifications, understand the rationale behind changes, and work together more effectively, ensuring that everyone is on the same page.&nbsp;<a href=\"https:\/\/softwareengineering.stackexchange.com\/questions\/419927\/best-practices-for-maintainable-graphviz-plantuml-code\" target=\"_blank\" rel=\"noreferrer noopener\">14<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"resources-and-further-reading\">Resources and Further Reading<\/h2>\n\n\n\n<p>The PlantUML Official Documentation provides a comprehensive guide on the syntax and features of PlantUML. It covers various types of UML diagrams, including class diagrams, sequence diagrams, and use case diagrams, making it an essential resource for both beginners and advanced users.&nbsp;<a href=\"https:\/\/plantuml.com\/class-diagram\" target=\"_blank\" rel=\"noreferrer noopener\">5<\/a><\/p>\n\n\n\n<p>The&nbsp;<a href=\"prompt:\/\/ask_markdown?question=JetBrains+Blog\" target=\"_blank\">JetBrains Blog<\/a>&nbsp;offers a detailed tutorial on creating UML diagrams using PlantUML in Rider. This tutorial is particularly useful for developers familiar with JetBrains IDEs, as it demonstrates how to integrate PlantUML seamlessly into their workflow, enhancing productivity and diagram accuracy.&nbsp;<a href=\"https:\/\/blog.jetbrains.com\/dotnet\/2020\/10\/06\/create-uml-diagrams-using-plantuml\/\" target=\"_blank\" rel=\"noreferrer noopener\">3<\/a><\/p>\n\n\n\n<p>The PlantUML Q&amp;A Forum is a community-driven platform where users can ask questions and share solutions related to PlantUML. This forum is invaluable for troubleshooting specific issues, learning best practices, and discovering new ways to utilize PlantUML&#8217;s features effectively.&nbsp;<a href=\"https:\/\/forum.plantuml.net\/1609\/better-control-of-the-layout-of-class-diagrams\" target=\"_blank\" rel=\"noreferrer noopener\">8<\/a><\/p>\n\n\n\n<p>The&nbsp;<a href=\"prompt:\/\/ask_markdown?question=GitHub+Repository\" target=\"_blank\">GitHub Repository<\/a>&nbsp;for PlantUML contains source code and examples of various PlantUML diagrams. It includes detailed documentation and sample files, making it a practical resource for developers looking to understand the implementation details and customize their diagrams.&nbsp;<a href=\"https:\/\/github.com\/plantuml-stdlib\/Azure-PlantUML\" target=\"_blank\" rel=\"noreferrer noopener\">15<\/a><\/p>\n\n\n\n<p><a href=\"prompt:\/\/ask_markdown?question=Stack+Overflow\" target=\"_blank\">Stack Overflow<\/a>&nbsp;hosts numerous discussions and solutions for common PlantUML issues. Users can find answers to specific questions, such as how to change the direction of diagrams or organize elements, making it a go-to resource for quick problem-solving and learning from the community&#8217;s collective experience.&nbsp;<a href=\"https:\/\/stackoverflow.com\/questions\/10581848\/plantuml-different-layouts\" target=\"_blank\" rel=\"noreferrer noopener\">16<\/a><\/p>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/plantuml.com\/imgw\/img-310f35cccd71096459f899a9db2d3b08.png\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction to PlantUML PlantUML is a versatile tool t &hellip; <a href=\"https:\/\/plantuml.cn\/index.php\/2024\/07\/26\/creating-class-diagrams-with-plantuml-a-comprehensive-tutorial\/\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u201cCreating Class Diagrams with PlantUML: A Comprehensive Tutorial\u201d<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-35","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/plantuml.cn\/index.php\/wp-json\/wp\/v2\/posts\/35"}],"collection":[{"href":"https:\/\/plantuml.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/plantuml.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/plantuml.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/plantuml.cn\/index.php\/wp-json\/wp\/v2\/comments?post=35"}],"version-history":[{"count":1,"href":"https:\/\/plantuml.cn\/index.php\/wp-json\/wp\/v2\/posts\/35\/revisions"}],"predecessor-version":[{"id":36,"href":"https:\/\/plantuml.cn\/index.php\/wp-json\/wp\/v2\/posts\/35\/revisions\/36"}],"wp:attachment":[{"href":"https:\/\/plantuml.cn\/index.php\/wp-json\/wp\/v2\/media?parent=35"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/plantuml.cn\/index.php\/wp-json\/wp\/v2\/categories?post=35"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/plantuml.cn\/index.php\/wp-json\/wp\/v2\/tags?post=35"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}