code

appendChild에서 추가한 원하지 않는(빈) xmlns 특성 제거

starcafe 2023. 9. 5. 20:40
반응형

appendChild에서 추가한 원하지 않는(빈) xmlns 특성 제거

다음 코드가 있습니다.

function setupProject($projectFile) {
  [xml]$root = Get-Content $projectFile;

  $project = $root.Project;

  $beforeBuild = $root.CreateElement("Target", "");
  $beforeBuild.SetAttribute("name", "BeforeBuild");
  $beforeBuild.RemoveAttribute("xmlns");
  $project.AppendChild($beforeBuild);

  $root.Save($projectFile);
}

새로 추가해야 합니다.<Target name="BeforeBuild" />XML 문서로 이동합니다.

하지만 빈 공간도 추가됩니다.xmlns=""내가 원하지 않는 속성.(사실 이 속성을 좋아하지 않는 것은 Visual Studio입니다!)

<Target name="BeforeBuild" xmlns="" />

나는 이미 이 코드를 시도했습니다.

$beforeBuild.RemoveAttribute("xmlns");
$project.AppendChild($beforeBuild);
$beforeBuild.RemoveAttribute("xmlns");

xmlns=""부모 요소가 네임스페이스에 있고 자식 요소가 없기 때문에 네임스페이스(un) 인증이 추가되었습니다.

이 네임스페이스 선언을 추가하지 않으려면 하위 요소를 상위 요소와 동일한 네임스페이스에 두고 요소를 생성할 때 이 네임스페이스에 배치해야 합니다.즉, 통화를 변경합니다.CreateElement("Target", "")올바른 네임스페이스를 지정합니다.

Michael Kay가 대답했듯이 이 원치 않는 네임스페이스를 제거하는 가장 좋은 방법은 상위 네임스페이스와 동일한 네임스페이스에 새 자식 요소를 만드는 것입니다.

function setupProject($projectFile) {
  [xml]$root = Get-Content $projectFile;

  $project = $root.Project;

  # UPDATE THIS LINE $beforeBuild = $root.CreateElement("Target", "");
  $beforeBuild = $root.CreateElement("Target", $project.NamespaceURI);
  $beforeBuild.SetAttribute("name", "BeforeBuild");
  $beforeBuild.RemoveAttribute("xmlns");
  $project.AppendChild($beforeBuild);

  $root.Save($projectFile);
}

가능한 해결 방법은 다음과 같습니다.

파워셸 및 csproj

Xml 네임스페이스 및 C# csproj

다음은 OP에 효과가 있었던 두 번째 솔루션의 해결 방법입니다.

$content = [xml] $content.OuterXml.Replace(" xmlns=`"`"", "")
$content.Save($_.FullName);

Javascript 사용

JS를 사용하여 XML 문서를 만들고 선언한 후 하위 노드에서 빈 xmlns 특성을 가져오는 경우xmlns="XXXX"상위 노드에서 JS 사용createElementNS(namespace, nodeName)대신에createElement(nodeName).

이는 자식 노드가 부모 노드와 동일한 네임스페이스를 공유하도록 가정한 것입니다.아래의 경우 'v1', 'v2' 등은 'data'의 NS를 공유합니다.

다음과 같이 표시됩니다.

let data = someArray;
let nameSpace = 'XXX';
let doc = "<?xml version='1.0' encoding='utf-8' ?><data xmlns='XXXX'></data>";
let parser = new DOMParser();
let xml = parser.parseFromString(doc, "text/xml");

for (let i = 0; i < data.length; i++) {
    let node = xml.createElementNS(nameSpace , "v" + (i + 1));
    $(node).text(data[i]);
    let elements = xml.getElementsByTagName("data");
    elements[0].appendChild(node);
 }

올바른 결과는 다음과 같습니다.

<?xml version='1.0' encoding='utf-8' ?>
<data xmlns='XXXX'>
    <v1></v1>
    <v2></v2>
</data>

BAD 결과 대비:

<?xml version='1.0' encoding='utf-8' ?>
<data xmlns='XXXX'>
    <v1 xmlns=""></v1>
    <v2 xmlns=""></v2>
</data>

이 솔루션을 사용하면 하위 노드에 대해 별도의 네임스페이스를 선언할 수도 있습니다.간단히 교체nameSpace다른 네임스페이스 URI 문자열 또는 다른 집합 변수를 가진 변수입니다.

네임스페이스는 각 노드 이름의 고유한 부분입니다.네임스페이스를 제거하면 노드를 다시 만들어야 합니다.네임스페이스 속성 없이 하위 노드를 만들 수 있는 코드입니다.

즉, 기본 태그에 네임스페이스 속성이 포함되어 있고 자식 태그에는 포함되어 있지 않습니다.따라서 하위 노드는 부모에서 기본 네임스페이스 특성을 상속합니다.네임스페이스 특성을 제거하는 가장 좋은 방법은 다음과 같습니다.

[xml]$oXMLDocument = (Get-Content "D:\myXml.xml")
# Assuming Project is the parent node with a namespace
$project = $oXMLDocument.Project
$childNode = $oXMLDocument.CreateElement("test",$project.NamespaceURI)
# (Optional) Add any attributes to the element
$childNode.SetAttribute("name", "value")
$oXMLDocument.DocumentElement.AppendChild($childNode)
# Save the document
$oXMLDocument.Save("D:\myXml2.xml")

기본적으로 하위 노트에서 네임스페이스 특성은 제거되지 않습니다.그리고 사실 당신은 할 수 없습니다.속성을 기본값으로 숨깁니다.

하위 노드 아래에 하위 자식을 작성해야 하는 경우 동일한 스타일을 수행합니다.

저는 VBA에서 웹 사이트 맵을 만드는 데 문제가 있었지만 @Neolisk가 저를 올바른 방향으로 이끌었습니다.이것으로 문제가 해결되었습니다.

'replace the empty attribute with nothing and load it back into the XML source
myTree.LoadXML Replace(myTree.XML, " xmlns=""""", "")

'Write that XML to a file
myTree.Save xmlFileName

도와주셔서 감사합니다, @Neolisk!

네임스페이스는 각 노드 이름의 고유한 부분입니다.네임스페이스를 제거하면 노드를 다시 만들어야 합니다.네임스페이스 속성 없이 하위 노드를 만들 수 있는 코드입니다.

[xml]$oXmlDocume = [xml] (Get-Content  D:\myXml.xml)
// Assuming Project is the parent node
$project = $oXMLDocument.Project
$childNode = $oXMLDocument.CreateElement("Child",$project.NamespaceURI)
$0XMLDocument.AppendChild($ChildNode)

하위 노드 아래에 하위 자식을 작성해야 하는 경우 동일한 스타일을 수행합니다.

언급URL : https://stackoverflow.com/questions/13220095/remove-unwanted-empty-xmlns-attribute-added-by-appendchild

반응형