1

I want to make the below graphml(xml) file.

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<graphml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd" xmlns="http://graphml.graphdrawing.org/xmlns">
  <key for="node" id="d3" yfiles.type="nodegraphics" />
  <graph edgedefault="directed" id="G">
    <node id="3">
      <data key="d3">
        <y:ShapeNode>
          <y:Geometry height="50" width="50" x="80" y="0" />
          <y:BorderStyle color="#000000" type="line" width="1.0" />
          <y:NodeLabel alignment="center" autoSizePolicy="content">TEST</y:NodeLabel>
        </y:ShapeNode>
      </data>
    </node>
    <node id="1000">
      <data key="d3">
        <y:ShapeNode>
          <y:Geometry height="50" width="50" x="240" y="0" />
          <y:BorderStyle color="#000000" type="line" width="1.0" />
          <y:NodeLabel alignment="center" autoSizePolicy="content">TEST</y:NodeLabel>
        </y:ShapeNode>
      </data>
    </node>
  </graph>
</graphml>

But my code made the below file

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<graphml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd" xmlns="http://graphml.graphdrawing.org/xmlns">
  <key for="node" id="d3" yfiles.type="nodegraphics" />
  <graph edgedefault="directed" id="G">
    <node id="3">
      <data key="d3">
        <y:ShapeNode xmlns:y="http://graphml.graphdrawing.org/xmlns">
          <y:Geometry height="50" width="50" x="80" y="0" />
          <y:BorderStyle color="#000000" type="line" width="1.0" />
          <y:NodeLabel alignment="center" autoSizePolicy="content">TEST</y:NodeLabel>
        </y:ShapeNode>
      </data>
    </node>
    <node id="1000">
      <data key="d3">
        <y:ShapeNode xmlns:y="http://graphml.graphdrawing.org/xmlns">
          <y:Geometry height="50" width="50" x="240" y="0" />
          <y:BorderStyle color="#000000" type="line" width="1.0" />
          <y:NodeLabel alignment="center" autoSizePolicy="content">TEST</y:NodeLabel>
        </y:ShapeNode>
      </data>
    </node>
  </graph>
</graphml>

Graphml program can not support the output-file because the file have the part "xmlns:y="http://graphml.graphdrawing.org/xmlns" in <y:ShapeNode xmlns:y="http://graphml.graphdrawing.org/xmlns">.

I want to erase the part "xmlns:y="http://graphml.graphdrawing.org/xmlns" in

<y:ShapeNode xmlns:y="http://graphml.graphdrawing.org/xmlns">

How to erase the part? What should I do? My source code is below

    XDocument xDoc = new XDocument();
    XNamespace graphmlNamespace = "http://graphml.graphdrawing.org/xmlns";
    XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");


    XElement mainElement = new XElement(graphmlNamespace + "graphml");
    XAttribute mainAttrib2 = new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName);
    XAttribute mainAttrib3 = new XAttribute(XNamespace.Xmlns + "y", "http://www.yworks.com/xml/graphml");
    XAttribute mainAttrib4 = new XAttribute("schemaLocation", "http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd");
    mainElement.Add(mainAttrib2);
    mainElement.Add(mainAttrib3);
    mainElement.Add(mainAttrib4);

    XElement subElement_key = new XElement(graphmlNamespace + "key");
    XAttribute subAttrib_key1 = new XAttribute("for", "node");
    XAttribute subAttrib_key2 = new XAttribute("id", "d3");
    XAttribute subAttrib_key3 = new XAttribute("yfiles.type", "nodegraphics");

    subElement_key.Add(subAttrib_key1);
    subElement_key.Add(subAttrib_key2);
    subElement_key.Add(subAttrib_key3);

    mainElement.Add(subElement_key);

    //
    XElement subElement_graph = new XElement(graphmlNamespace + "graph");
    XAttribute subAttrib_graph1 = new XAttribute("edgedefault", "directed");
    XAttribute subAttrib_graph2 = new XAttribute("id", "G");

    subElement_graph.Add(subAttrib_graph1);
    subElement_graph.Add(subAttrib_graph2);

    mainElement.Add(subElement_graph);

    //
    for( int i=0; i< 2; i++) // for test
    {
        XElement sub2Element_node = new XElement(graphmlNamespace + "node");
        XAttribute sub2Attrib_node1 = new XAttribute("id", row["SkillEnumID"].ToString());
        sub2Element_node.Add(sub2Attrib_node1);

        subElement_graph.Add(sub2Element_node);

        // <data key="d3">
        XElement sub3Element_data = new XElement(graphmlNamespace + "data");
        XAttribute sub3Attrib_data1 = new XAttribute("key", "d3");
        sub3Element_data.Add(sub3Attrib_data1);
        sub2Element_node.Add(sub3Element_data);


        //<y:ShapeNode>
        XElement sub4Element_yShapeNode = new XElement(graphmlNamespace + "ShapeNode");
        XAttribute sub4Attrib_yShapeNode1 = new XAttribute(XNamespace.Xmlns + "y", graphmlNamespace);
        sub4Element_yShapeNode.Add(sub4Attrib_yShapeNode1);



        sub3Element_data.Add(sub4Element_yShapeNode);

        //<y:Geometry height="30.0" width="30.0" x="-15.0" y="-15.0"/>
        int iX = 0;
        Int32.TryParse(row["ColumnNumber"].ToString(), out iX);
        iX = (iX * (m_iNodeWidth + m_iXGap));

        int iY = 0;
        Int32.TryParse(row["RowNumber"].ToString(), out iY);
        iY = (iY * (m_iNodeHeight + m_iYGap));

        XElement sub5Element_yGeometry = new XElement(graphmlNamespace + "Geometry");
        XAttribute sub5Attrib_yGeometry1 = new XAttribute("height", m_iNodeHeight.ToString());
        XAttribute sub5Attrib_yGeometry2 = new XAttribute("width", m_iNodeWidth.ToString());
        XAttribute sub5Attrib_yGeometry3 = new XAttribute("x", iX.ToString());
        XAttribute sub5Attrib_yGeometry4 = new XAttribute("y", iY.ToString());
        sub5Element_yGeometry.Add(sub5Attrib_yGeometry1);
        sub5Element_yGeometry.Add(sub5Attrib_yGeometry2);
        sub5Element_yGeometry.Add(sub5Attrib_yGeometry3);
        sub5Element_yGeometry.Add(sub5Attrib_yGeometry4);

        sub4Element_yShapeNode.Add(sub5Element_yGeometry);

        // <y:Fill color="#FFCC00" transparent="false"/>
        XElement sub5Element_yBorderStyle = new XElement(graphmlNamespace + "BorderStyle");
        XAttribute sub5Attrib_yBorderStyle1 = new XAttribute("color", "#000000");
        XAttribute sub5Attrib_yBorderStyle2 = new XAttribute("type", "line");
        XAttribute sub5Attrib_yBorderStyle3 = new XAttribute("width", "1.0");
        sub5Element_yBorderStyle.Add(sub5Attrib_yBorderStyle1);
        sub5Element_yBorderStyle.Add(sub5Attrib_yBorderStyle2);
        sub5Element_yBorderStyle.Add(sub5Attrib_yBorderStyle3);

        sub4Element_yShapeNode.Add(sub5Element_yBorderStyle);

        //<y:NodeLabel alignment="center" autoSizePolicy="content">10 테스트</y:NodeLabel>
        string strLabel = "TEST";

        XElement sub5Element_yNodeLabel = new XElement(graphmlNamespace + "NodeLabel");
        XAttribute sub5Attrib_yNodeLabel1 = new XAttribute("alignment", "center");
        XAttribute sub5Attrib_yNodeLabel2 = new XAttribute("autoSizePolicy", "content");
        sub5Element_yNodeLabel.Add(sub5Attrib_yNodeLabel1);
        sub5Element_yNodeLabel.Add(sub5Attrib_yNodeLabel2);
        sub5Element_yNodeLabel.Value = strLabel;

        sub4Element_yShapeNode.Add(sub5Element_yNodeLabel);
    }

    //

    xDoc.Add(mainElement);

    xDoc.Declaration = new XDeclaration("1.0", "utf-8", "no");
    xDoc.Save(strFileFullPath);
Kirill Polishchuk
  • 54,804
  • 11
  • 122
  • 125

3 Answers3

1

Simply remove these two lines:

XAttribute sub4Attrib_yShapeNode1 = new XAttribute(XNamespace.Xmlns + "y", graphmlNamespace);
sub4Element_yShapeNode.Add(sub4Attrib_yShapeNode1);

Your XML already contains defined default namespace: http://graphml.graphdrawing.org/xmlns and ShapeNode is defined in this namespace.

Kirill Polishchuk
  • 54,804
  • 11
  • 122
  • 125
  • I'm not sure if it helps as nodes need to be in 2 namespaces, while only one is defined in the code... But you may be right - way too much code for sample to be sure... – Alexei Levenkov Nov 14 '12 at 03:15
  • @AlexeiLevenkov, What do you mean? According to provided XML `ShapeData` is defined in `http://graphml.graphdrawing.org/xmlns`. So there is no need to specify namespace inside it, because XML has default namespace as `http://graphml.graphdrawing.org/xmlns`. According to XML spec both XMLs are correct, so it is issue of OP's XML parser. – Kirill Polishchuk Nov 14 '12 at 03:19
  • `y:ShapeNode` in first XML has "http://www.yworks.com/xml/graphml" as namespace... not the "http://graphml.graphdrawing.org/xmlns" which is using empty namespace prefix. – Alexei Levenkov Nov 14 '12 at 06:11
1

Why have you initialized graphmlNamespace to a different value from the one you want? If you want the elements to be in namespace http://www.yworks.com/xml/graphml, then put them in that namespace, not in http://graphml.graphdrawing.org/xmlns.

Michael Kay
  • 156,231
  • 11
  • 92
  • 164
0

You are explicitly redefining y to be prefix of other (graphmlNamespace) namespace. You ShapNode and other nodes with y: prefix should be in "http://www.yworks.com/xml/graphml" namespace. You need another XNamespace for that namespace/prefix in your code.

Alexei Levenkov
  • 98,904
  • 14
  • 127
  • 179