C# 如何从xml结构访问子元素?

C# 如何从xml结构访问子元素?,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我有以下基本svg文档,其中包含1个flowtext和1个文本元素: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommon

我有以下基本svg文档,其中包含1个flowtext和1个文本元素:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="744.09448819"
   height="1052.3622047"
   id="svg2"
   version="1.1"
   inkscape:version="0.48.2 r9819"
   sodipodi:docname="New document 1">
  <defs
     id="defs4" />
  <sodipodi:namedview
     id="base"
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1.0"
     inkscape:pageopacity="0.0"
     inkscape:pageshadow="2"
     inkscape:zoom="0.35"
     inkscape:cx="375"
     inkscape:cy="520"
     inkscape:document-units="px"
     inkscape:current-layer="layer1"
     showgrid="false"
     inkscape:window-width="1366"
     inkscape:window-height="706"
     inkscape:window-x="-8"
     inkscape:window-y="-8"
     inkscape:window-maximized="1" />
  <metadata
     id="metadata7">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g
     inkscape:label="Layer 1"
     inkscape:groupmode="layer"
     id="layer1">
    <flowRoot
       xml:space="preserve"
       id="flowRoot2985"
       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Arial;font-style:normal;font-weight:normal;font-size:40px;line-height:125%;letter-spacing:0px;word-spacing:0px;-inkscape-font-specification:Arial;font-stretch:normal;font-variant:normal;text-anchor:middle;text-align:center;writing-mode:lr">
      <flowRegion
         id="flowRegion2987">
         <rect
           id="rect2989"
           width="600"
           height="162.85715"
           x="97.14286"
           y="89.505043"
           style="-inkscape-font-specification:Arial;font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:40px;text-anchor:middle;text-align:center;writing-mode:lr;line-height:125%" />
       </flowRegion>
      <flowPara
         id="flowPara2993">Yahoo</flowPara>
    </flowRoot> 


    <text
       xml:space="preserve"
       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
       x="197.14285"
       y="352.36218"
       id="text3003"
       sodipodi:linespacing="125%">
      <tspan
         sodipodi:role="line"
         id="tspan3005"
         x="197.14285"
         y="352.36218">Gmail</tspan>
    </text>
  </g>
</svg>

但这是行不通的。请帮帮我?

如果您不支持Linq2Xml,您可以使用
XmlDocument
XPath

var doc = new XmlDocument();
doc.Load(fileName);

var nodeList = doc.SelectNodes("//g");
if(nodeList != null)
    foreach (XmlNode node in nodeList)
    {
        // do anything you like
    }
说明:

SelectNodes(String)
匹配XPath表达式


//g
在XPath中选择文档中的所有元素。

您可以通过以下方式将XPath与xdoc一起使用

var nodes = svg.XPathSelectElements(path);

这将给您的g节点,然后您可以使用.Element(“”)或.Elements(“”)查询这些节点的子节点,具体取决于您希望多个子节点或单个子节点的位置。

尝试一下,您的XML使用名称空间:

        XDocument doc = XDocument.Load(<path to file>);
        XNamespace ns1 = "http://www.w3.org/2000/svg";
        //Namespace of a root element can also be retrieved like this:
        //XNamespace ns1 = doc.Root.GetDefaultNamespace();
        var g = doc.Descendants(ns1 + "g").FirstOrDefault();
        if (g != null)
        {
            var flowroot = g.Element(ns1 + "flowRoot");
            var text = g.Element(ns1 + "text");
        }
XDocument doc=XDocument.Load();
XNS1=”http://www.w3.org/2000/svg";
//根元素的命名空间也可以按如下方式检索:
//XNamespace ns1=doc.Root.GetDefaultNamespace();
var g=doc.substands(ns1+“g”).FirstOrDefault();
如果(g!=null)
{
var flowroot=g.元素(ns1+“flowroot”);
var text=g.Element(ns1+“text”);
}
您应该在名称前加上名称空间:

        IEnumerable<XElement> elements = svg.Element(ns1 + "g").Elements();
IEnumerable elements=svg.Element(ns1+“g”).elements();
此处,(使用此选项)

IEnumerable elements=svg.XPath(//g/*”);
返回其中的两个元素。但是如果有多个
g
,而您只需要第一个,请使用
“//g[1]/*”


,单击“测试”以运行测试。测试之后,删除
[1]
以查看结果是否包含下一个
g
,这样您就可以看到是否有超过1个
g
来获得想要的结果,这一点很重要。

尝试使用子体,而不是元素。是的,我尝试了
svg.substands(“g”).substands()
但是感谢所有回答我问题的人,但是谁能告诉我哪里错了,为什么这些
元素
Decentants
方法在这里不起作用?我不同意这一点。使用XDocument要高效得多。这并不能回答用户的问题。
        IEnumerable<XElement> elements = svg.Element(ns1 + "g").Elements();
IEnumerable<XElement> elements = svg.XPath("//g/*");